如另一个答案所述,该代码是异步的,您不能简单地在回调链(嵌套函数)中返回想要的值。您需要公开一些接口,以便在您拥有所需的值(因此,将其回调或回调)后用信号通知调用代码。
在另一个答案中提供了一个回调示例,但是肯定有一个替代选项值得探讨:promises。
该模块将返回一个可以输入两种状态的已实现(已实现或已拒绝),而不是您使用所需结果调用的回调函数。调用代码等待承诺进入这两种状态之一,当它执行时将调用适当的函数。模块通过
resolveing或
rejecting
触发状态更改。无论如何,这是一个使用promise的例子:
db1.js:
// db1.jsvar MongoClient = require('mongodb').MongoClient;var Promise = require('rsvp').Promise;module.exports = { FindinCol1: function() { return new Promise(function(resolve, reject) { MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) { if (err) { reject(err); } else { resolve(db); } } }).then(function(db) { return new Promise(function(resolve, reject) { var collection = db.collection('col1'); collection.find().toArray(function(err, items) { if (err) { reject(err); } else { console.log(items); resolve(items); } }); }); }); }};// app.jsvar db = require('./db1');db.FindinCol1().then(function(items) { console.info('The promise was fulfilled with items!', items);}, function(err) { console.error('The promise was rejected', err, err.stack);});现在,更多的最新版本的node.js
mongodb驱动程序具有对Promise的本地支持,您无需做任何工作即可将回调包装在上述Promise中。如果您使用的是最新驱动程序,那么这是一个更好的示例:
// db1.jsvar MongoClient = require('mongodb').MongoClient;module.exports = { FindinCol1: function() { return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) { var collection = db.collection('col1'); return collection.find().toArray(); }).then(function(items) { console.log(items); return items; }); }};// app.jsvar db = require('./db1');db.FindinCol1().then(function(items) { console.info('The promise was fulfilled with items!', items);}, function(err) { console.error('The promise was rejected', err, err.stack);});Promise为异步控制流提供了一种极好的方法,我强烈建议您花一些时间来熟悉它们。



