这是一个Express网站。
以下是我的代码。这只是一些尖峰代码供我玩,试图弄脏工作:
索引/的 routes.js
router.get('/', function(req, res) {
var sqlStatement = "Select top 10 from customers";
var rows = connection.invokeQuery(sqlStatement);
res.render('index', { title: 'My App', customers: rows});
});
module.exports = router;
问题是它在尝试将数据呈现到页面之前没有等待查询完成。所以我尝试将其置于回调中,但仍然无法正常工作。我需要承诺或观察者吗?
router.get('/', function(req, res) {
var sqlStatement = "Select top 10 from customers";
var rows = connection.invokeQuery(sqlStatement, function(){
res.render('index', { title: 'My App', customers: rows});
});
});
我也创建了这个方法:
connection.invokeQuery = function(sqlQuery){
...code before this
db.query(sqlQuery, function(err, rows){
if(rows ) {
data = rows;
console.log(rows);
}
if(err) { console.log(err); }
})
}
);
});
return data;
};
我注意到的另一件事是,当我启动我的网站时,在我的invokeQuery函数中,它立即击中了return data
。它还没有打到我的SQL查询。这是另一个问题。
我可能认为这完全错了,但我不知道如何处理这种非常常见的情况。
ANSWER
好的,这很简单,想通了。
var rows = connection.invokeQuery(sqlStatement, function(rows){
res.render('index', { title: 'Dave\'s App', cobrands: rows});
});
connection.invokeQuery = function(sqlQuery, callback){
...code before this
db.query(sqlQuery, function(err, rows){
if(rows ) {
data = rows;
console.log(rows);
callback(rows);
}
if(err) { console.log(err); }
})
}
);
});
答案 0 :(得分:3)
不确定您的数据库对象是什么样的,但您可能想要这样的东西,并将数据库结果传递给回调。
connection.invokeQuery(sqlStatement, function(rows) {
res.render('index', { title: 'My App', customers: rows});
});