Mongoose更新通过$设置一个值,如果NOT undefined(NodeJS)

时间:2016-05-17 14:06:59

标签: node.js mongodb mongoose

检查未定义值的正确方法是什么?我想要做的是有一个PUT方法,将更新那些非空的字段。例如,如果我发送req.body.name = 'John'而不是req.body.job,我希望我的请求只更改名称。

一些代码:

router.put('/:id', (req, res) => {
    const query = {_id: req.params.id};
    const update = {
        $set: {
            name: req.body.name,
            job: req.body.job
        }
    };

    User.findOneAndUpdate(query, update,
        (err, userUpdated) => {
            if (err) {
                console.log('Error while updating');
                console.log(err);
            } else {
                res.send(userUpdated);
            }
        });
});

这当然会引发错误:

CastError: Cast to number failed for value "undefined" at path "job"

现在我可以手动检查req.body.job是否为空,如果设置它的值是用户之前的值,但这似乎是一个黑客,不优雅,每条路线都有很多写作。< / p>

我检查了docs,但是那里提供的选项似乎都没有。我也遇到了类似express validator的内容,但如果值为空,这可能只会执行return。另一种选择是简单地从前端部分发送值。

我是后期开发的新手,我不确定我是否正在以“正确的方式”做事。所以,任何关于它应该如何做的评论都会很好(如果我的代码看起来很奇怪,请随时指导我:)),谢谢!

1 个答案:

答案 0 :(得分:3)

您可以编写自己的方法来执行此操作。

例如这个例子

var req = {body: {name: undefined, job: 'yes'}};
const _ = require('lodash');

const out = {};
_(req.body).forEach((value,key) => {
    if (!_.isEmpty(value)){
        out[key] = value;
    }
});

console.log(out);

有这个输出

{ job: 'yes' }

如果您愿意,也可以将其写为中间件

function onlyNotEmpty(req, res, next) => {
    const out = {};
    _(req.body).forEach((value, key) => {
        if (!_.isEmpty(value)) {
            out[key] = value;
        }
    });

    req.bodyNotEmpty = out;
    next();
}

然后你可以用中间件

编写你的方法
router.put('/:id', onlyNotEmpty, (req, res) => {
    const query = {_id: req.params.id};
    const update = {
        $set: req.bodyNotEmpty
    };

    // This will be the same
});