如何多次获取数据expressJS

时间:2017-12-17 04:30:10

标签: node.js mongodb express

我想同时显示chatbot和facebook数据。怎么显示它?因为当我尝试在浏览器中运行但它没有出现任何东西。我试图在stackoverflow上查找它,但没有得到正确的参考

route.js

app.get('/cpanel/facebook', function(req, res) {
        if (req.session.user == null) {
            res.redirect('/cpanel/login');
        }   else {
            CB.getAllRecords( function(e, chatbot) {
                res.render('cpanel/facebook', { udata : req.session.user, chatbot : chatbot });
            });
            FBM.getAllRecords( function(e, facebook) {
                res.render('cpanel/facebook', { udata : req.session.user, facebook : facebook });
            });
        }
    });

facebook.js

var facebook = db.collection('facebook');

exports.addNewFacebook = function(newData, callback) {
    facebook.findOne({accesstoken:newData.accesstoken}, function(e, o) {
        if (o) {
            callback('accesstoken-taken');
        }   else {
            facebook.insert(newData, {safe: true}, callback);
        }
    });
}

exports.getAllRecords = function(callback) {
    facebook.find().toArray(
        function(e, res) {
            if (e) callback(e)
            else callback(null, res)
        }
    );
}

chatbot.js

var chatbot = db.collection('chatbot');

exports.addNewChatBot = function(newData, callback) {
    chatbot.insert(newData, {safe: true}, callback);
}

exports.getAllRecords = function(callback) {
    chatbot.find().toArray(
        function(e, res) {
            if (e) callback(e)
            else callback(null, res)
        }
    );
}

1 个答案:

答案 0 :(得分:1)

管理node.js中异步操作的更简单方法,尤其是当您要协调多个操作时,使用Promises而不是普通回调。而且,幸运的是,mongodb现在为其所有异步操作支持基于promise的接口。

所以,首先更改你的方法以返回一个promise而不是回调:

var chatbot = db.collection('chatbot');

exports.getAllRecords = function() {
    return chatbot.find().toArray();
}

var facebook = db.collection('facebook');

exports.getAllRecords = function() {
    return facebook.find().toArray();
}

然后,您可以使用Promise.all()的这些承诺来协调:

app.get('/cpanel/facebook', function(req, res) {
    if (req.session.user == null) {
        res.redirect('/cpanel/login');
    } else {
        Promise.all([CB.getAllRecords(), FBM.getAllRecords()]).then(results => {
            res.render('cpanel/facebook', { udata : req.session.user, chatbot : results[0], facebook: results[1]});
        }).catch(err => {
            // render some error page here
            res.sendStatus(500);
        });
    }
});

对于只返回一个承诺的单个函数的调用,您可以使用.then()

app.get('/cpanel/facebook', function(req, res) {
    if (req.session.user == null) {
        res.redirect('/cpanel/login');
    } else {
        FBM.getAllRecords().then(results => {
            res.render('cpanel/facebook', { udata : req.session.user, facebook: results});
        }).catch(err => {
            // render some error page here
            res.sendStatus(500);
        });
    }
});