猫鼬更新总是给我 TypeError: Cannot set property '__v' of undefined

Posted

技术标签:

【中文标题】猫鼬更新总是给我 TypeError: Cannot set property \'__v\' of undefined【英文标题】:mongoose Update always gives me TypeError: Cannot set property '__v' of undefined猫鼬更新总是给我 TypeError: Cannot set property '__v' of undefined 【发布时间】:2015-12-02 18:42:20 【问题描述】:

每当用户断开连接时,我都会尝试将 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】:

您的代码存在一些问题。

更新:将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 $setOnInsert和mongoose docs for findOneAndUpdate

【讨论】:

感谢您花时间回答这个问题,我之所以要更新socketId是因为我在用户架构中有socketId字段。因此,每当具有相同 socketId 值的特定用户断开连接时,我希望他的 socketId 为空字符串或 null。 目前我使用的是普通的查找然后保存的方法来解决这个问题 @JackMoscovi 好的,但是您是否尝试过将findOneAndUpdate 与更正的参数集一起使用?并且:如果用户断开连接,更新布尔字段 valid 并保持 socketId 的原始值不变,难道不是更有意义吗?

以上是关于猫鼬更新总是给我 TypeError: Cannot set property '__v' of undefined的主要内容,如果未能解决你的问题,请参考以下文章

错误:TypeError:user.insertOne 不是使用猫鼬的函数

猫鼬总是返回空数组? [复制]

猫鼬总是返回空数组? [复制]

在结果消息猫鼬节点验证中显示实际错误

当我运行迁移时,uuid 字段总是在更新,它会给我一些性能问题,任何人都可以向我解释原因和解决方案

节点猫鼬总是在 findOne 上返回错误