从导出的模块返回variables并将其用于另一个文件(NodeJS)

我在服务器端有两个.js文件: app.jsmanageDB.js 。 我想从MongoDB中检索数据并在客户端使用它。

manageDB.js:

 exports.getClients = function() { db.clients.find(function(err, docs) { if (err) { console.log(err); } else { return docs; } }); }; 

我想在app.js中做这样的事情:

 app.get('/', function(req, res) { var clients = manageDB.getClients(); res.render('index.html', {myClients: clients}); }); 

但客户端由于asynchronous性而未定义。 如果我在getClients函数(manageDB.js文件)的控制台中loggingdocs ,这是可以的,但如果我尝试在app.js文件中的console.log(manageDB.getClients()) – 它不起作用。 我将不胜感激任何帮助。

正如你所指出的,JS是asynchronous的。 db.clients.find知道这一点,所以它需要一个callback,这正是你需要做的。 如果你提供真实的代码,可以简化为:

 // manageDB.js // Note I added `module`. It is best practice module.exports.getClients = function(callback) { db.clients.find(callback); }; //app.js app.get('/', function(req, res) { manageDB.getClients(function(err, docs) { if (err) throw new Error(err); res.render('index.html', { myClients: docs }); }); 

或者,如果您需要在manageDB.js执行其他一些处理:

 // manageDB.js module.exports.getClients = function(callback) { db.clients.find(function(err, docs) { if (err) { return callback(err); } // do more stuff return callback(null, docs); }); }; //app.js app.get('/', function(req, res) { manageDB.getClients(function(err, docs) { if (err) throw new Error(err); res.render('index.html', { myClients: docs }); }); 

正如你已经提到的,Node.JS是asynchronous的。 处理这个问题的一个方法就是通过callback来传递数据。 其他包括承诺和协程。

例如:

 module.exports.getClients = function(callback) { db.clients.find(function(err, docs) { if (err) { console.log(err); return callback(err); } return callback(null, docs); }); }; 

然后使用这个:

 app.get('/', function(req, res) { manageDB.getClients(function(err, clients) { if(err) { // Handle error } else { res.render('index.html', {myClients: clients}); } }); });