2016-12-17 93 views
0

我写了一个小型数据库函数,它从数据库中获取一些数据并将其放入我想要的格式,但我很难返回数据以使用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 }); 
    }); 
}); 

我认为路由器的功能是为数据无限期地等待,虽然我没有错误,但页面永不加载。我究竟做错了什么?

回答

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); 
+0

这是绝对完美的,非常感谢你为我所做的一切错误的解释。我已经实施了您建议的更改,包括错误检查。这对我来说都是新鲜事物,所以我仍然在围绕着它。谢谢您的帮助! – Steve

+0

最好是了解如何正确使用promise,而不是将它们转换为回调。 –