2014-10-27 123 views
4

我有这样的代码在node.js中/ express.js:如何知道Mongoose的upsert是否创建了一个新文档?

var User = mongoose.model('User'); 
var usersRouter = express.Router(); 
usersRouter.put('/:id', function(req, res) { 
    req.body._id = req.params.id; 
    var usr = new User(req.body); 

    usr.validate(function (err) { 
     if (err) { 
      res.status(400).json({}); 
      return; 
     } 

     var upsertData = usr.toObject(); 
     delete upsertData._id; 

     User.update({_id: usr._id}, upsertData, {upsert: true}, function(err) { 
      if (err) { 
       res.status(500).json({}); 
       return; 
      } 

      res.status(204).json({}); 
     }); 
    }); 
}); 

它工作正常,但我想发送给客户端不同的反应,如果一个新的文件被创建(201身份使用JSON在响应主体中)或现有的更新(状态204)。

有没有办法区别User.update的回调?

回答

5

使用来自回调函数的第三个参数:

... 
User.update({_id: usr._id}, upsertData, {upsert: true}, function(err, num, n) { 
    if (err) { 
    res.status(500).json({}); 
    return; 
    } 

    if (!n.updatedExisting) { 
     /* new document */ 
    } 

    res.status(204).json({}); 
}); 
... 

n是这样一个对象:

{ updatedExisting: false, 
    upserted: <ObjectId>, 
    n: 1, 
    connectionId: 11, 
    err: null, 
    ok: 1 } 

updatedExisting属性是true当文件被更新 - 因此它被创造之前。如果是false,则表示新文档是在此次调用期间创建的。

+0

完美的工作! 感谢您的快速和干净的答案! – 2014-10-27 16:40:29

+0

@CarloVespa酷!别客气。现在你应该拥有投票权。 :-)我提高了你,所以你15岁以上。 – 2014-10-27 16:48:45

相关问题