【问题标题】:How do I return my data from a function?如何从函数返回我的数据?
【发布时间】:2016-12-17 09:44:37
【问题描述】:

我编写了一个小型数据库函数,它从数据库中获取一些数据并将其放入我想要的格式,但我在返回数据以使用 Express 显示时遇到了困难。数据库功能如下:

function getAllEvents(req, res, next) {
  db.any('select * from sensors, events where sensors.sensorid = events.sensorid')
    .then(function (data) {
        var final = [];

        data.forEach(function(datas){
            if (!final[datas.sensorid]){
                final[datas.sensorid] = {};
            }
            if (!final[datas.sensorid].name){
                final[datas.sensorid].name = datas.name;
                final[datas.sensorid].signatures = {};
            }
            if (!final[datas.sensorid].signatures[datas.signature]){
                final[datas.sensorid].signatures[datas.signature] = {};
                final[datas.sensorid].signatures[datas.signature].id = "sen" + datas.sensorid + "sig" + datas.signature;
                final[datas.sensorid].signatures[datas.signature].signature = datas.signature;
                final[datas.sensorid].signatures[datas.signature].message = datas.message;
                final[datas.sensorid].signatures[datas.signature].events = {};
            }

            final[datas.sensorid].signatures[datas.signature].events[datas.eventid] = datas;
        })

        return final;

    })
    .catch(function (err) {
      console.log("Something went wrong! ", err)
    });
}

调用它的路由函数是这样的:

router.get('/events', function(req, res, next) {
    db.getAllEvents(function(err, data){
        res.render('events', { data: data });
    });
});

我认为路由器功能正在无限期地等待数据,尽管我没有收到任何错误但页面永远不会加载。我做错了什么?

【问题讨论】:

    标签: node.js express pg-promise


    【解决方案1】:

    我做错了什么?

    这段代码:

    router.get('/events', function(req, res, next) {
        db.getAllEvents(function(err, data){
            res.render('events', { data: data });
        });
    });
    

    除了您没有检查错误之外还可以。请注意,getAllEvents 需要一个函数作为参数。

    现在让我们看看你的 getAllEvents 函数原型

    function getAllEvents(req, res, next) {
    

    这根本不正确,应该是这样的

    function getAllEvents(callback) {
    

    然后你就可以像这样调用回调并“返回”结果

    return callback(null,data);
    

    或者如果您在数据库连接期间发生错误,则将错误传递给回调

    return callback(err);
    

    【讨论】:

    • 这绝对是完美的,非常感谢您对我做错了什么的解释。我已经实施了您建议的更改,包括错误检查。这对我来说是全新的,所以我还在纠结。感谢您的帮助!
    • 最好是了解如何正确使用 Promise,而不是将其转换为回调。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2018-05-24
    • 2011-08-16
    • 2015-06-29
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多