检索callback函数范围外的MongoDB结果

我试图通过MongoClient findOne方法(在r参数中)检索callback函数范围之外的文档。 我怎么能做到这一点?

也许我对Node.js使用MongoDB驱动的方法不适用。

function loadUser(name) { var result = {}; function connection(err, db) { assert.equal(null, err); function callback(err, r) { assert.equal(null, err); db.close(); result = r; // This does not work } db.collection('users').findOne({'user.name':name}, callback); } MongoClient.connect(url, connection); return result; } 

你这样做,结果将不是正确的对象,因为它是在MongoDB可以find它和赋值之前返回的。

你应该这样做:

 function loadUser(name, cb) { function connection(err, db) { assert.equal(null, err); function callback(err, r) { assert.equal(null, err); db.close(); cb(err, r) // user } db.collection('users').findOne({'user.name':name}, callback); } MongoClient.connect(url, connection); return; } 

loadUser的用法是:

 loadUser("example", function(err, user){ console.log(user); //Now do what you need with user }); 

另请注意,如果您始终在search用户,最好打开一次连接,并在应用程序终止时closures它。

你的'结果'variables居住在loadUser函数的范围内。 与MongoDB的交互将是asynchronous​​的,所以当你的callback触发的时候,loadUser函数将完成,结果variables将不再存在。

您可以简单地将结果variables移到全局范围。 尽pipe你可能想重构你的代码,所以callback函数会通知正在等待返回结果的任何东西。

您可以使用EventEmitter来处理asynchronous任务,这使得数据stream更易于维护,尤其是当您需要执行大量条件任务时:

 "use strict"; var MongoClient = require('mongodb').MongoClient; const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} var url = 'mongodb://localhost:27017/myproject'; const myEmitter = new MyEmitter(); // connect to database var db = MongoClient.connect(url, function(err, dbs) { if (err) { console.log(err); return; } console.log("Connected correctly to server"); db = dbs; //get user when connected myEmitter.emit('getUser'); }); // getUser event myEmitter.on('getUser', function() { db.collection('users').findOne({ 'user.name': "test" }, function callback(err, r) { if (err) { myEmitter.emit('processError', err); } else { myEmitter.emit('processResult', r); } db.close(); }); }); // process result event myEmitter.on('processResult', function(result) { //result received, process it here console.log("result : " + result); }); // error event myEmitter.on('processError', function(err) { //an error occured, process the error here console.log("error : " + err); });