从导出的模块返回变量并在另一个文件中使用它(NodeJS)

时间:2016-04-25 22:04:10

标签: javascript node.js mongodb

我在服务器端有两个.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});
});

但由于异步,客户端未定义。如果我在docs函数(manageDB.js文件)中的控制台中记录getClients,那可以,但如果我在app.js文件中尝试console.log(manageDB.getClients()) - 它不起作用。我将不胜感激任何帮助。

2 个答案:

答案 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 });
  });