leo*_*APA 3 mongoose mongodb node.js express
这是用户架构:
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 }
});
Run Code Online (Sandbox Code Playgroud)
这是 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."
});
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果用户只想更新有限的字段,例如只更新用户名,那么上面的代码是行不通的,错误是这样的:
{
"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"
},
.........
Run Code Online (Sandbox Code Playgroud)
那么我该如何实现以允许用户更新某些字段而不是所有字段?
任何意见和建议表示赞赏!
将findOneAndUpdate与更新对象中的运算符$set一起使用:
User.findOneAndUpdate({username: req.params.username}, { $set: req.body }, { new: true }, callback);
Run Code Online (Sandbox Code Playgroud)
$set将允许您仅修改req.body对象中提供的字段。
我最终使用了这个解决方案:
const dot = require('dot-object'); // this package works like magic
const updateData = { some: true, fields: true };
User.updateOne(
{ _id: req.user._id },
{ $set: dot.dot(updateData) },
(err, results) => {
if (err) res.json({ err: true });
else res.json({ success: true });
}
);
Run Code Online (Sandbox Code Playgroud)
我在这里找到了这个想法:https://github.com/Automattic/mongoose/issues/5285#issuecomment-439378282
| 归档时间: |
|
| 查看次数: |
9916 次 |
| 最近记录: |