【问题标题】:How to multiple fetch data expressJS如何多次获取数据expressJS
【发布时间】:2017-12-17 17:46:46
【问题描述】:

我想同时显示聊天机器人和 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)
        }
    );
}

聊天机器人.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)
        }
    );
}

【问题讨论】:

  • 简短回答。对数据库使用 promises 接口而不是普通的回调接口,然后使用Promise.all() 跟踪两个请求何时完成。您将希望切换到管理异步操作的 Promise,因为使用 Promise 时管理多个异步操作更简单。
  • 你有示例代码吗?

标签: node.js mongodb express


【解决方案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);
        });
    }
});

【讨论】:

  • 感谢您的帮助。我尝试按照您提供的代码进行操作,但出现错误:SyntaxError: Unexpected token>
  • @ArifFirmansyah - 该错误在哪一行代码上?你确定你在这里完全复制了代码吗?你运行的是什么版本的 node.js?
  • 对不起,我复制粘贴错误。现在可以在浏览器中运行。我也想问,promise.all 是否需要 npm install --save promise-all?因为我这样做
  • @ArifFirmansyah - Promise.all() 是 ES6 的一部分,内置在最新版本的 node.js 中,因此不需要单独安装。
  • 我想再问一下,单条数据如何显示?例如仅聊天机器人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多