问题描述
我想知道是否可以在将表单保存到数据库之前使用 DOmpurify 来清理表单上的用户输入。以下是我在 routes.js 文件夹中为我的表单发布的内容:
.post('/questionForm',(req,res,next) =>{
console.log(req.body);
/*console.log(req.headers);*/
const questions = new QuestionForm({
_id: mongoose.Types.ObjectId(),price: req.body.price,seats: req.body.seats,body_style: req.body.body_style,personality: req.body.personality,activity: req.body.activity,driving: req.body.driving,priority: req.body.priority
});
var qClean = DOmpurify.sanitize(questions);
//res.redirect(200,path)({
// res: "Message recieved. Check for a response later."
//});
qClean.save()
.then(result => {
//res.redirect(200,'/path')({
// //res: "Message recieved. Check for a response later."
//});
res.status(200).json({
docs:[questions]
});
})
.catch(err => {
console.log(err);
});
});
我也在页面顶部用
导入了包import DOmpurify from 'dompurify';
当我运行服务器并提交发布请求时,它抛出 500 错误并声称 dompurify.sanitize 不是函数。我是否在错误的地方使用它,和/或在后端使用它甚至是正确的?
解决方法
这可能有点晚了,但对于像我这样碰巧遇到这个用例的其他人,我找到了一个到目前为止似乎非常适合的 npm 包。它被称为同构-dompurify。
DOMPurify 需要一个 DOM 来与之交互;通常由浏览器提供。 Isomorphic-dompurify 提供 DOMPurify 另一个包“jsdom”,作为一个依赖项,就像一个补充的虚拟 DOM,所以 DOMPurify 知道如何清理你的输入服务器端。
用包自己的话来说“DOMPurify 需要一个 DOM 树作为基础,默认情况下在 Node 中不可用。为了在服务器端工作,我们需要创建一个假 DOM 并提供给 DOMPurify。这意味着服务器端的 DOMPurify 初始化逻辑与客户端不同”。