因此,我在弄乱Koa.js和生成器,只是将它们放到一个简单的站点中以进行演示。我正在使用带有node-sqlite3
和Q的sqlite进行承诺。这是我的数据库代码:
module.exports.getLogs = function(){
var deferred = Q.defer();
var results = [];
db.serialize(function(){
db.each("SELECT ipAddress, action, details, timestamp FROM logs", function(err, row) {
results.push({
ipAddress: row.ipAddress,
action: row.action,
details: row.action,
timestamp: new Date(row.timestamp)
});
}, function(){
deferred.resolve(results);
});
});
return deferred.promise;
}
因此,基本上我只是Q.defer来“实现”对数据库的调用。然后,在我的koa路线中,我有这个:
app.get('/logs', function *(){
var logs = yield db.getLogs();
yield this.render('logs', {logs: logs});
});
我遇到的问题是请求只是挂起,浏览器从未得到响应。真正奇怪的是,如果我在
yield db.getLogs()
之后放置console.log语句,则可以看到db的结果。视图在那里,一切似乎都应该起作用,但事实并非如此。任何帮助我将不胜感激! 最佳答案
好吧,经过无奈之后,事实证明,当我尝试使用Q或bluebird时,都遇到了这个问题。当我切换到本地Promises时,它就如鱼得水。我将不得不进一步研究以弄清楚到底发生了什么,但是我会把它留在这里,以防将来有人遇到这种情况。另外,如果有人好奇,我正在使用节点0.11.13
和q版本:1.1.2