简体   繁体   中英

Return variable from exported module and use it in another file (NodeJS)

I've got two .js files on the server-side: app.js and manageDB.js . I would like to retrieve data from MongoDB and use it on the client-side.

manageDB.js:

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

And I would like to do something like this in app.js:

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

but clients are undefined because of asynchronism. If I log docs in the console within getClients function (manageDB.js file) it is ok but if I try to console.log(manageDB.getClients()) within app.js file - it doesn't work. I would appreciate any help.

As you've already mentioned, Node.JS is asynchronous. One way of working with this is passing the data via a call back. Others include promises and coroutines.

For example:

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

        return callback(null, docs);
    });
};

And then use this:

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

As you have noted, JS is async. db.clients.find knows this, so it requires a callback, which is exactly what you need to do too. If you are providing real code, it could be simplified to this:

// 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 });
  });

Or if you need to do some other processing in 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 });
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM