在进行另一次更改之前,Mongoose和Express没有反映Schema的更改?

时间:2015-02-11 01:52:40

标签: node.js mongodb mongoose

在要发表的帖子请求中,我将以下update发送到我的用户架构中的数组:

  User.findOne({username: username}, function (err, user) {
    if (err) {
      throw err;
    }
    if (!user) {
      res.status(401).send('No user with that username');
    }
    if (typeof items === 'number') {
      user.update({$push: {cart: items}}, {}, function (err) {
        if (err) {
          console.log('There was an error adding the item to the cart');
          throw err
        } else {
          console.log('update', user);
          res.send(user);
        }
      });
    }
  }

当我在快递或我的应用程序中记录用户时,发生的变化是我所做的更改(在这种情况下是对购物车的添加)在下一次更改之前不会显示。就好像记录和发送user时一样,不会更新。我知道在检查我的数据库时进行了更改(添加了项目),但在响应中发送的user仍然是原始用户(来自原始响应)(即在更改之前)。如何发送更新的用户,我认为会从user.update返回?

1 个答案:

答案 0 :(得分:1)

要执行您尝试执行的操作,将涉及使用save()方法而不是update(),这涉及一些不同的实现。这是因为在模型上调用update()不会修改模型的实例,它只是在模型的集合上执行更新语句。相反,您应该使用findOneAndUpdate方法:

if (typeof items === 'number') {
  User.findOneAndUpdate({username: username}, {$push: {cart: items}}, function(err, user){
    // this callback contains the the updated user object

    if (err) {
      console.log('There was an error adding the item to the cart');
      throw err
    }
    if (!user) {
      res.status(401).send('No user with that username');
    } else {
      console.log('update', user);
      res.send(user);
    }
  })
}

在幕后它执行与您正在执行的完全相同的操作,执行find()然后更新(),除了它还返回更新的对象。