从导出的模块返回variables并将其用于另一个文件(NodeJS)
我在服务器端有两个.js文件: app.js
和manageDB.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}); } }); });