经过15年的VB6和MySql之后,我对node和mongo还是陌生的。我确定这不是我的最终程序要使用的东西,但是我需要对如何在另一个模块中调用函数并返回结果有一个基本的了解。
我希望模块具有打开数据库,在集合中查找并返回结果的功能。我可能还想在该模块中为其他集合添加更多功能。现在,我需要它尽可能简单,以后可以添加错误处理程序等。我花了几天的时间在函数周围尝试不同的方法,module.exports = {…,但没有,.send,万事大吉。我了解它是异步的,因此程序可能在数据到达之前已经通过了显示点。
这是我在运行带有col1集合的db1数据库的Mongo上尝试过的方法。
Db1.js var MongoClient = require('mongodb').MongoClient; module.exports = { FindinCol1 : function funk1(req, res) { MongoClient.connect("mongodb://localhost:27017/db1", function (err,db) { if (err) { return console.dir(err); } var collection = db.collection('col1'); collection.find().toArray(function (err, items) { console.log(items); // res.send(items); } ); }); } }; app.js a=require('./db1'); b=a.FindinCol1(); console.log(b);
当调用’FindinCol1’而不是console.log(b)(返回’undefined’)时,Console.log(items)工作,所以我没有得到返回或在返回时将其粘贴。我已经阅读了数十篇文章,并观看了许多视频,但是我仍然停留在这一点上。任何帮助将不胜感激。
如另一个答案所述,该代码是异步的,您不能简单地在回调链(嵌套函数)中返回想要的值。您需要公开一些接口,以便在您拥有所需的值(因此,将其回调或回调)后用信号通知调用代码。
在另一个答案中提供了一个回调示例,但是肯定有一个替代选项值得探讨:promises。
该模块将返回一个可以输入两种状态的已实现(已实现或已拒绝),而不是您使用所需结果调用的回调函数。调用代码等待承诺进入这两种状态之一,当它执行时将调用适当的函数。模块通过resolveing或rejecting 触发状态更改。无论如何,这是一个使用promise的例子:
resolve
reject
db1.js:
// db1.js var MongoClient = require('mongodb').MongoClient; /* node.js has native support for promises in recent versions. If you are using an older version there are several libraries available: bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it. */ 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.js var 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.js var 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.js var 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为异步控制流提供了一种极好的方法,我强烈建议您花一些时间来熟悉它们。