2014-12-23 2 views
0

Итак, я возился с Koa.js и генераторами, просто собрал простой сайт для демонстрационных целей. Я использую sqlite с node-sqlite3 и Q для обещаний. Вот мой дб код:Запрос Koa.js с обещаниями висит

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 к «promisify» вызов к базе данных. Тогда, в моем коа пути, у меня есть это:

app.get('/logs', function *(){ 
    var logs = yield db.getLogs(); 
    yield this.render('logs', {logs: logs}); 
}); 

Проблема у меня в том, что запрос просто висит, браузер никогда не получает ответа. Что действительно странно, так это если я ставлю инструкцию console.log после yield db.getLogs(), я вижу, что результаты из db просто прекрасны. Представление есть, все кажется, что он должен работать, но этого просто нет. Любая помощь мне очень понравилась!

+0

Я предполагаю, что вам не нужна вторая «доходность». –

+0

@torazaburo Спасибо, что посмотрели. Оказалось, что это странная проблема, см. Мой ответ на вопрос. – BFree

+0

Просто из любопытства вы можете поделиться тем, как вы обедаете вызов db с помощью Q и с местными обещаниями? –

ответ

2

OK, после большого разочарования, выясняется, что когда я пробовал Q или синюю птицу, у меня была эта проблема. Как только я переключился на родные обещания, он работал плавно. Мне нужно еще кое-что придумать, чтобы понять, что происходит, но я оставлю это здесь, если кто-то столкнется с этим в будущем. Кроме того, если кому-то интересно, я работал с узлом 0.11.13 и q версией: 1.1.2