如何从函数中返回数据?
问题描述:
我写了一个小型数据库函数,它从数据库中获取一些数据并将其放入我想要的格式,但我很难返回数据以使用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 });
});
});
我认为路由器的功能是为数据无限期地等待,虽然我没有错误,但页面永不加载。我究竟做错了什么?
答
我在做什么错?
此代码:
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);
这是绝对完美的,非常感谢你为我所做的一切错误的解释。我已经实施了您建议的更改,包括错误检查。这对我来说都是新鲜事物,所以我仍然在围绕着它。谢谢您的帮助! – Steve
最好是了解如何正确使用promise,而不是将它们转换为回调。 –