我试图限制用户在mongodb中插入对象时可以发布的字段。我知道我可以强制填写字段,但我似乎无法找到人们插入我不想要的字段。
这是我现在用于插入项目的代码。
app.post("/obj", function (req, res) {
var newObj = req.body;
//TODO filter fields I don't want ?
if (!(newObj .id || newObj .type)) {
handleError(res, "Invalid input", "Must provide a id and type.", 400);
return;
}
db.collection(OBJ_COLLECTION).insertOne(newObj, function(err, doc) {
if (err) {
handleError(res, err.message, "Failed to create new object.");
} else {
res.status(201).json(doc.ops[0]);
}
});
});
答案 0 :(得分:1)
可能有JS本地方法可以做到这一点,但我倾向于使用Lodash作为我大多数项目的工具箱,在这种情况下,我通常做的是设置允许字段的白名单,然后只提取那些从发布的值中如下:
const _ = require('lodash');
app.post("/obj", function (req, res) {
var newObj = _.pick(req.body, ['id', 'type','allowedField1','allowedField2']);
这非常简单,我通常还将其他地方的白名单定义为重用(例如在模型等上)。
作为旁注,我避免使用'id'作为某个人可以发布到新对象的字段,除非我真的需要,以避免与自动生成的_id字段混淆。
此外,如果您希望对文档进行更多基于模型的控制,您应该真正研究mongoose而不是使用直接mongodb驱动程序。除此之外,如果未在模式中定义任何字段,它将从对象中删除任何字段。当模式中有 的内容时,我仍然使用_.pick()
方法,但我不希望人们在特定的控制器方法中进行更改。