下面是UserSchema:
var UserSchema = new Schema({
username: { type: String, required: true, index:{unique: true} },
firstName: { type: String, required: true },
lastName: { type: String, required: true },
email: { type: String, required: true, index:{unique: true} },
password: { type: String, required: true, select: false }
});
下面是http PUT请求:
// update user information
api.put('/users/:username', function(req, res) {
User.findOne({username: req.params.username}, function(err, user) {
if (err){
res.send(err);
return;
}
if (!user){
res.status(404).send({
success: false,
message: "user not found"
});
} else {
user.username = req.body.username;
user.email = req.body.email;
user.password = req.body.password;
user.firstName = req.body.firstName;
user.lastName = req.body.lastName;
user.save(function(err) {
if (err){
res.send(err);
return;
}
res.json({
success: true,
message: "user information updated."
});
});
}
});
});
问题是,如果用户只想更新有限的字段,例如,只更新用户名,那么上面的代码不起作用,错误看起来像这样:
{
"message": "User validation failed",
"name": "ValidationError",
"errors": {
"lastName": {
"properties": {
"type": "required",
"message": "Path `{PATH}` is required.",
"path": "lastName"
},
"message": "Path `lastName` is required.",
"name": "ValidatorError",
"kind": "required",
"path": "lastName"
},
"firstName": {
"properties": {
"type": "required",
"message": "Path `{PATH}` is required.",
"path": "firstName"
},
.........
那么,我如何实现允许用户更新部分字段而不是所有字段?
任何意见和建议都很感激!
5条答案
按热度按时间bqucvtff1#
在update对象中使用findOneAndUpdate和运算符$set:
$set
将允许您仅修改req.body
对象中提供的字段。a1o7rhls2#
我最终使用了这个解决方案:
我在这里找到了这个想法:https://github.com/Automattic/mongoose/issues/5285#issuecomment-439378282
8iwquhpp3#
这是一个很好的妥协:
指定用户可以更新的字段
然后删除所有包含falsy值的键
然后使用$set运算符更新值
oyt4ldly4#
可以使用'findOneAndUpdate'方法。
8fq7wneg5#
据我所知,您希望能够更新任何数量的字段。下面的代码来自一个过去的项目。
模型
HTTP PUT
PUT请求(json)
或者如果你想更新一个字段
基本上,你有一个数组的这些属性/字段名称和它们的新值。你可以只更新一个或所有这些方式,如果你愿意。或者我都不相信。
希望这能有所帮助!有什么问题尽管问!