gpt4 book ai didi

node.js - Mongoose 通过 $set a value if NOT undefined 进行更新 (NodeJS)

转载 作者:可可西里 更新时间:2023-11-01 10:03:06 25 4
gpt4 key购买 nike

检查未定义值的正确方法是什么?我想要做的是有一个 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 是否为空,如果它被设置为用户之前的值,但这似乎是一个 hack,不优雅而且很多为每条路线编写。

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

我是后端开发的新手,我不确定自己是否以“正确的方式”做事。因此,请对应该如何完成的任何评论都很好(如果我的代码看起来很奇怪,请随时指导我 :)),谢谢!

最佳答案

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

比如这个例子

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

关于node.js - Mongoose 通过 $set a value if NOT undefined 进行更新 (NodeJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37278482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com