【问题标题】:Node API update not working节点 API 更新不起作用
【发布时间】:2015-10-25 12:15:42
【问题描述】:

我正在通过尝试使用 Postman 更新具有文件名的数组来测试 API。 当我使用 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 express 路由器:

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”值,但您可以看到 images 数组为空。

【问题讨论】:

  • 你的意思是说图像名称没有插入 mongodb 对吗?

标签: node.js mongodb express postman


【解决方案1】:

你做错了。像 $addToSet 这样的操作符的更新是原子的,这意味着它们直接在数据库上进行更改,然后完成。

所以像.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()返回修改后的文档:

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,或者在后一种函数情况下,不会返回任何文档。

只有当您检索到文档并在常规代码中修改了内容而不是数据库方法时,您才使用像 .save() 这样的方法。 “检索/修改/保存”不是一个好习惯,因为其他操作可能会在这些操作发生之间更新数据库中的文档,从而给您留下被覆盖的信息和不一致的状态。

【讨论】:

  • 非常感谢您在这里提供的丰富信息。非常感谢。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多