Node + Mongo:更新记录需要回调

10

我正在使用socket.io监听事件,一旦触发,我会尝试将记录更新为新值。

socket.on('contentEdited', function (newContent) {

collection.update(
    { '_id' : ObjectId("5279262e74d92da751eb2b8e") }, 
    { $set: { 
      'content': newContent
      } 
    }
  ), function (err, result) {
    if (err) throw err;
    console.log(result)
  };

});

在shell中,语法可行,但是当事件触发时,在node中会抛出以下错误:

Error: Cannot use a writeConcern without a provided callback

我尝试添加一个函数作为基本的错误检查,但我不确定如何以mongo期望的方式提供回调。

我对这还有点新,请多指教。谢谢!


1
虽然我不太了解Mongo,但在Google上快速搜索“写入关注点”得到了这个结果:http://docs.mongodb.org/manual/core/write-concern/ - Vinay
是的,我看过那个了,但是针对这种情况,我需要强写关注,并且成功回调会很有用。 - Pirijan
2个回答

17

我认为你的问题在于回调函数需要在update函数调用内部而不是外部。nodejs MongoDB驱动程序的格式可以在这里找到:http://mongodb.github.io/node-mongodb-native/api-generated/collection.html#update

所以代码应该看起来像这样:

collection.update(
   { '_id' : ObjectId("5279262e74d92da751eb2b8e") }, 
   { $set: { 'content': newContent } },
   function (err, result) {
      if (err) throw err;
      console.log(result);
   })
请注意,括号已移至回调函数之后。
您还可以将写入关注设置为“未确认”而不是“已确认”。
MongoDB的“写入关注”概念确定了您希望MongoDB成功写入数据库的程度。最低级别的写入关注,“未确认”,只会将数据写入服务器并且不等待响应。这曾经是默认设置,但现在默认设置为等待MongoDB确认写入。
您可以在此处了解更多有关写入关注的信息: http://docs.mongodb.org/manual/core/write-concern/ 要将写入关注设置为未确认,请添加选项{w: 0}
collection.update(
   { '_id' : ObjectId("5279262e74d92da751eb2b8e") }, 
   { $set: { 'content': newContent } },
   { w : 0 });

我应该在原始帖子中提到这一点,但我知道我可以使用w:0使其工作,但数据完整性在这种情况下很重要。你的答案看起来不错。我会在到达我的Mac时尝试并跟进。谢谢! - Pirijan

0

是的,也许您使用了错误的语法。这可能会使它变得更好。

socket.on('contentEdited', function (newContent) {

collection.update(
   { '_id' : ObjectId("5279262e74d92da751eb2b8e") }, 
   { $set: 
       { 'content': newContent } 
   },
   {returnOriginal : false},
   function (err, result) {
      if (err) throw err;
      console.log(result);
   });

})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接