Nodejs: can not use a writeConcern without a provided callback

Nodejs: can not use a writeConcern without a provided callback

今天做到注册,还是按照书上一步一步来,后来发现注册的相应post函数跟发送微博的post函数重名了,于是乎,就该改了注册的post函数名为doReg,修改时,我将routes和app.js中相对应的字段都进行了修改,当我再次启动服务器,出现上述错误。我找到最近的文件查找问题。以下是module中自定义的user模块

User.prototype.save = function save(callback){
 var user = {
 	name: this.name,
 	password: this.password
 	};
 mongodb.open(function(err,db){
 	if(err){
   return callback(err);
   }
 	db.collection('users',function(err,collection){
   if(err){
    mongodb.close();
    return callback(err);
    }
   collection.ensureIndex('name',{unique: true});
   collection.insert(user,{safe: true},function(err,user){
    mongodb.close();
    callback(err,user);
    });
   });
 	})
 };

提示是

db.collection('users',function(err,collection)这句和collection.ensureIndex('name',{unique: true});

这句有问题。


6 回复

根据你提供的信息,错误信息“can not use a writeConcern without a provided callback”表明你在使用MongoDB的writeConcern选项时没有提供回调函数。writeConcern是MongoDB的一个选项,用于确保写操作在返回给客户端之前已经完成到一定的程度(例如,数据已经被复制到一定数量的副本)。

让我们看看如何解决这个问题。首先,你需要确保在进行数据库操作时,每个异步操作都有一个相应的回调函数来处理结果或错误。

下面是修改后的代码示例:

User.prototype.save = function (callback) {
    var user = {
        name: this.name,
        password: this.password
    };

    // 打开数据库连接
    mongodb.open(function (err, db) {
        if (err) {
            return callback(err); // 如果打开数据库失败,直接调用回调函数并传递错误
        }

        db.collection('users', function (err, collection) {
            if (err) {
                db.close(); // 关闭数据库连接
                return callback(err); // 返回错误
            }

            // 确保索引存在
            collection.ensureIndex('name', { unique: true }, function (err) {
                if (err) {
                    db.close(); // 关闭数据库连接
                    return callback(err); // 返回错误
                }

                // 插入用户数据
                collection.insert(user, { safe: true }, function (err, result) {
                    db.close(); // 关闭数据库连接
                    callback(err, result); // 调用回调函数并传递结果或错误
                });
            });
        });
    });
};

解释

  1. 数据库连接:在打开数据库连接后,如果发生错误,则立即通过回调函数返回错误。
  2. 集合获取:获取users集合。如果发生错误,则关闭数据库连接并返回错误。
  3. 创建唯一索引:确保用户名字段具有唯一性。如果创建索引时发生错误,则关闭数据库连接并返回错误。
  4. 插入文档:将用户数据插入到users集合中。如果插入过程中发生错误,则关闭数据库连接并返回错误。如果没有错误,通过回调函数返回插入的结果。

通过这种方式,每个异步操作都有对应的回调函数来处理其结果或错误,从而避免了“can not use a writeConcern without a provided callback”的错误。


谷歌后,找到了 将collection.ensureIndex(‘name’,{unique: true});改成: collection.ensureIndex(‘name’,{unique: true},{w: 0}); 这种该法是你不考虑跟数据库处理的结果,如果担心出错,你可以加一个回调函数。 原文地址:http://stackoverflow.com/questions/14407834/error-when-inserting-a-document-into-mongodb-via-node-js (ps:话说,这个小问题,蛋疼的好久啊)

hello,小菜问个问题:<Node.js开发指南>中微博例子的搭建过程中,mongodb的使用时用到:

db.collection('users',function(){});

这样去取’users’这个集合,但是整个项目都没有看到在哪里声明了这个集合,求指教

Existing collections can be opened with collection

db.collection([[name[, options]], callback); If strict mode is off, then a new collection is created if not already present.

貌似改成这样还是不行啊,报object is not function 的错误。我改成这样就好了 collection.ensureIndex(‘name’,{unique: true}, function(err){});

根据你的描述,问题在于使用 writeConcern(如 {safe: true})时,需要提供一个回调函数来处理操作的结果或错误。如果省略了回调函数,则会抛出错误。

在你的代码中,你使用了 {safe: true} 作为写入选项,这意味着你需要确保有一个回调函数来处理写入结果。以下是一个修正后的版本,其中包含了必要的回调函数:

User.prototype.save = function save(callback) {
  var user = {
    name: this.name,
    password: this.password
  };

  mongodb.open(function(err, db) {
    if (err) {
      return callback(err);
    }

    db.collection('users', function(err, collection) {
      if (err) {
        db.close();
        return callback(err);
      }

      collection.ensureIndex('name', { unique: true }, function(err) {
        if (err) {
          db.close();
          return callback(err);
        }

        collection.insert(user, { safe: true }, function(err, result) {
          db.close();
          callback(err, result);
        });
      });
    });
  });
};

解释:

  1. 确保每个数据库操作都有回调:在每个数据库操作(如 db.collection()collection.ensureIndex())之后添加回调函数。
  2. 关闭数据库连接:无论操作成功与否,都需要在回调函数中关闭数据库连接。
  3. 传递回调参数:在回调函数中正确地传递错误和结果给外部调用者。

通过这种方式,你可以确保即使在使用 writeConcern 时也能正常处理错误和结果。

回到顶部