【问题标题】:Koa.js request with promises is hanging带有承诺的 Koa.js 请求挂起
【发布时间】:2015-02-21 06:31:46
【问题描述】:

所以我在搞搞 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 语句,我会看到来自数据库的结果就好了。视图在那里,一切似乎都应该工作,但它根本没有。任何帮助我都会非常感激!

【问题讨论】:

  • 我猜你不需要第二个yield
  • @torazaburo 感谢您的收看。原来是一个奇怪的问题,请参阅我对问题的回答。
  • 出于好奇,你能分享一下你是如何用 Q 和原生承诺来承诺 db 调用的吗?

标签: javascript node.js sqlite koa


【解决方案1】:

好的,经过一番挫折,事实证明,当我尝试 Q 或 bluebird 时,我遇到了这个问题。一旦我切换到原生 Promises,它就可以流畅地工作。我将不得不进一步挖掘以弄清楚到底发生了什么,但我会把它留在这里,以防将来有人遇到这种情况。另外,如果有人好奇,我正在运行 node 0.11.13 和 q 版本:1.1.2

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2019-09-17
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多