mongoose Update总是给我TypeError:不能设置undefined的属性'__v'

时间:2015-09-07 08:59:51

标签: node.js mongodb mongoose socket.io

每当用户断开连接时,我都会尝试将socketId更新为''。但不知怎的,我总是得到这个错误

update.$setOnInsert[this.schema.options.versionKey] = 0;
                                                        ^
TypeError: Cannot set property '__v' of undefined

例如我的目标,如果有人断开连接

socketId = ZH_Ic0zD8QkmNYuJAAAE;
will be
socketId = '';

这是代码

  socket.on('disconnect', function() {
    console.log(socket.id);
    var disconnectSocketId = '';
    User.findOneAndUpdate({socketId: socket.id}, disconnectSocketId, {upsert: true, new: true}, function(err, doc) {
      if (err) {
        return console.error
      }

      console.log(doc.socketId);
    });
  });

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

更新:将socket.id作为query对象传递的问题显然已经针对您问题的最新修改进行了修复。

最重要的是,TypeError表明显然没有对象update.$setOnInsert(我知道this.schema.options.versionKey包含字符串"__v"),因此您尝试将属性分配给未定义宾语。您应该首先以某种方式初始化它:

var update = {
  $setOnInsert: {},
  $set: {}
  ...
} 

如果我说得对,你想将$setOnInsert对象作为文档对象的一部分传递给findOneAndUpdate(),对吧?您的函数参数化看起来不对:disconnectSocketId应该保存带有要更新的字段的文档对象,但是您只传递一个空字符串。同样只是传递socket.id作为查询对象看起来不正确。此外:您确定要通过清除标识符来更新记录吗?最后:请注意,如果您使用$setOnInsert传递要更新的字段,如果您查询的记录已存在(即具有该ID),则实际上不会更新您的数据。

假设update表示包含字段信息以及如何更新字段的对象,我认为您正在尝试执行类似的操作:

User.findOneAndUpdate({ socketId: socket.id }, update, { upsert: true, new: true }, function(err, doc) {
  ...
}

请务必查看mongoDB docs for $setOnInsertmongoose docs for findOneAndUpdate