限制已插入的已发布字段

时间:2016-08-08 19:29:05

标签: node.js mongodb express

我试图限制用户在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]);
        }
    });
});

1 个答案:

答案 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()方法,但我不希望人们在特定的控制器方法中进行更改。