在下面的控制stream中使用响应之前,如何等待节点/快速应用程序中mongo findOne查询的响应

我是新来的节点,也是JavaScript的callback。

我试图检查一个帐户是否存在在mongo中,然后'保存',如果没有,并返回一个错误,如果是的话。

我目前正在试图找出我的快速应用程序之外。 这是我的..

var MongoClient = require('mongodb')。MongoClient;

MongoClient.connect('mongodb://localhost:27017/main', function (err, db) { if(err) throw err; var query = { name : "www.website.com"} findOne(db, query, function (doc) { if(doc) { console.log('account exists'); } else { console.log('good to go'); } console.dir(doc); }); }); var findOne = function (db, query, callback) { db.collection('accounts').findOne(query, function (err, doc) { if(err) throw err; db.close(); callback(); }); } 

console.dir(doc); 上面返回undefined 。 如何在使用callback至console.log之前等待findOne返回或保存帐户?

你得到未定义的原因是因为当你打电话给你的callback你没有通过它的文档。 该行应该看起来像callback(doc)。

以下是您的代码的更新版本,并提供一些build议:

 MongoClient.connect('mongodb://localhost:27017/main', function (err, db) { if(err) throw err; var query = { name : "www.website.com"} findOne(db, query, function (err, doc) { if(err) { // something went wrong console.log(err); return; } if(doc) { console.log('account exists'); console.dir(doc); } else { console.log('good to go'); } }); }); var findOne = function (db, query, callback) { db.collection('accounts').findOne(query, function (err, doc) { db.close(); if(err) { // don't use throw when in async code // the convention is to call your callback with the error // as the first argument (notice that I added an argument // to the definition of your callback above) callback(err); } else { // call your callback with no error and the data callback(null, doc); } }); }