我在服务器端有两个.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});
});
但由于异步,客户端未定义。如果我在docs
函数(manageDB.js文件)中的控制台中记录getClients
,那可以,但如果我在app.js文件中尝试console.log(manageDB.getClients())
- 它不起作用。我将不胜感激任何帮助。
答案 0 :(得分:2)
正如您已经提到的,Node.JS是异步的。处理此问题的一种方法是通过回调传递数据。其他包括承诺和协同程序。
例如:
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});
}
});
});
答案 1 :(得分:2)
正如您所知,JS是异步的。 db.clients.find
知道这一点,所以它需要一个回调,这正是你需要做的。如果您提供真实的代码,可以简化为:
// 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 });
});