节点 API 更新不工作
Node API update not working
我正在测试 API,方法是尝试使用 Postman 更新具有文件名的数组。
当我用 mongo 查询数组时,它是空的。
具有图像数组的用户模型:
var UserSchema = new Schema({
name: String,
email: { type: String, required: true, validate: [validate.email, 'invalid email address'],
index: { unique: true }},
password: { type: String, required: true, select: false },
images: [{ name: String }]
});
apiRouter 快速路由器:
apiRouter.put('/images/:user_id/:file_name', function(req, res){
User.findById(req.params.user_id, function(err, user) {
//console.log(req.params.user_id);
//console.log(req.params.file_name);
user_id = req.params.user_id;
file_name = req.params.file_name;
user.update({$addToSet:{'images': file_name}});
user.save(function(err) {
if (err) return res.send(err);
res.json({ message: 'User updated!' });
});
});
});
邮递员:
PUT http://localhost:3000/api/images/5626fd2903c49d6231518c9/imageA
和mongo db.find():
"images" : [ ]
file_name 拥有正确的 "imageA" 值,但如您所见,图像数组是空的。
你这样做全错了。使用像 $addToSet
这样的运算符进行更新意味着是原子的,这意味着它们直接在数据库上进行更改,然后完成。
所以像 .update()
这样的调用需要一个用于匹配文档的查询组件和一个 "update" 组件来修改匹配的文档:
apiRouter.put('/images/:user_id/:file_name', function(req, res) {
User.update(
{ "_id": req.params.user_id },
{ "$addToSet": {"images": req.params.file_name } },
function(err,numAffected) {
if (err) {
return res.send(err);
} else if ( numAffected == 0 ) {
res.json({ "message": "Not found" })
} else {
res.json({ "message": "User updated!" });
}
}
);
});
否则使用.findByIdAndUpdate()
来return修改后的文件:
apiRouter.put('/images/:user_id/:file_name', function(req, res) {
User.findByIdAndUpdate(req.params.user_id,
{ "$addToSet": {"images": req.params.file_name } },
{ "new": true },
function(err,user) {
if (err) {
return res.send(err);
} else if ( !user ) {
res.json({ "message": "Not found" })
} else {
res.json(user);
}
}
);
});
还请注意,如果没有匹配的文档来执行更新,则它不是 err
,而是受影响的文档将是 0
,或者在后一种函数情况下将没有文件 returned.
只有当您检索到文档并使用常规代码而不是数据库方法修改了内容时,您才可以使用 .save()
之类的方法。 "retrieve/modify/save" 不是一个好的做法,因为其他操作可能会在这些操作发生之间更新数据库中的文档,从而使您的信息被覆盖并且状态不一致。
我正在测试 API,方法是尝试使用 Postman 更新具有文件名的数组。 当我用 mongo 查询数组时,它是空的。 具有图像数组的用户模型:
var UserSchema = new Schema({
name: String,
email: { type: String, required: true, validate: [validate.email, 'invalid email address'],
index: { unique: true }},
password: { type: String, required: true, select: false },
images: [{ name: String }]
});
apiRouter 快速路由器:
apiRouter.put('/images/:user_id/:file_name', function(req, res){
User.findById(req.params.user_id, function(err, user) {
//console.log(req.params.user_id);
//console.log(req.params.file_name);
user_id = req.params.user_id;
file_name = req.params.file_name;
user.update({$addToSet:{'images': file_name}});
user.save(function(err) {
if (err) return res.send(err);
res.json({ message: 'User updated!' });
});
});
});
邮递员:
PUT http://localhost:3000/api/images/5626fd2903c49d6231518c9/imageA
和mongo db.find():
"images" : [ ]
file_name 拥有正确的 "imageA" 值,但如您所见,图像数组是空的。
你这样做全错了。使用像 $addToSet
这样的运算符进行更新意味着是原子的,这意味着它们直接在数据库上进行更改,然后完成。
所以像 .update()
这样的调用需要一个用于匹配文档的查询组件和一个 "update" 组件来修改匹配的文档:
apiRouter.put('/images/:user_id/:file_name', function(req, res) {
User.update(
{ "_id": req.params.user_id },
{ "$addToSet": {"images": req.params.file_name } },
function(err,numAffected) {
if (err) {
return res.send(err);
} else if ( numAffected == 0 ) {
res.json({ "message": "Not found" })
} else {
res.json({ "message": "User updated!" });
}
}
);
});
否则使用.findByIdAndUpdate()
来return修改后的文件:
apiRouter.put('/images/:user_id/:file_name', function(req, res) {
User.findByIdAndUpdate(req.params.user_id,
{ "$addToSet": {"images": req.params.file_name } },
{ "new": true },
function(err,user) {
if (err) {
return res.send(err);
} else if ( !user ) {
res.json({ "message": "Not found" })
} else {
res.json(user);
}
}
);
});
还请注意,如果没有匹配的文档来执行更新,则它不是 err
,而是受影响的文档将是 0
,或者在后一种函数情况下将没有文件 returned.
只有当您检索到文档并使用常规代码而不是数据库方法修改了内容时,您才可以使用 .save()
之类的方法。 "retrieve/modify/save" 不是一个好的做法,因为其他操作可能会在这些操作发生之间更新数据库中的文档,从而使您的信息被覆盖并且状态不一致。