检查未定义值的正确方法是什么?我想要做的是有一个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
。另一种选择是简单地从前端部分发送值。
我是后期开发的新手,我不确定我是否正在以“正确的方式”做事。所以,任何关于它应该如何做的评论都会很好(如果我的代码看起来很奇怪,请随时指导我:)),谢谢!
答案 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
});