Mongoose更新通过$设置一个值,如果没有定义(NodeJS)

什么是检查未定义值的正确方法? 我想要做的是有一个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是否为空,如果它被设置为用户以前的值,但这似乎是一个黑客,不优雅和大量的每个路线的写作。

我已经检查了文档,但没有提供的选项似乎做这项工作。 我也碰到过类似明确的validation器,但是如果值是空的,这可能只是做一个return 。 另一种select是简单地发送来自前端部分的值。

我是新来的后端开发,我不知道我是否在做“正确的方式”。 所以请,任何评论应该怎么做会好(如果我的代码看起来很奇怪,随时引导我:)),谢谢!

你可以写自己的方法来做到这一点。

例如这个例子

 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 });