2013-11-16 1 views
11

Я пытаюсь использовать обещание внутри функции app.get, которая будет запускать запрос, который будет выполняться по обещанию. но проблема в том, что ответ не ждет обещания и просто отвечает.Как использовать обещания внутри экспресс-приложения?

любая идея, как код должен так обещание жить внутри app.get в экспресс-приложении?

+1

Не могли бы вы показать нам код, который используете? Мы не можем дать вам точный ответ без него. –

+1

Если вы хотите использовать что-то, что еще не получило от внимания, которое имеет Express, но явно предназначено для обещаний, вы можете рассмотреть вопрос: HTTP-приложения с Q-IO https://github.com/kriskowal/q -io, тонкий слой на Q-IO, называемый Joey https://github.com/montagejs/joey, или Bogart https://github.com/nrstott/bogart, все из которых используют Q и основаны на CommonJS/JSGI + обещает + обещание потоков. –

+0

спасибо, ребята, кажется, что обещания действительно работают на vanilla express, но не на версии, запущенной на parse.com ... так что я сделал, это переместить логику из кода облака parse.com и в экземпляр azure windows. в долгосрочной перспективе я думаю, что это будет лучше для нас, чем ретрансляция на их дистрибутиве. – samiq

ответ

18
app.get('/test', function (req, res) { 
    db.getData() 
    .then(function (data) { 
     res.setHeader('Content-Type', 'text/plain'); 
     res.end(data); 
    }) 
    .catch(function (e) { 
     res.status(500, { 
      error: e 
     }); 
    }); 
}); 
+0

Не могли бы вы также связать вызов соединения в обещании ... т.е., 'db.connectAsync ({stuff;}), затем (function (dbh) {app.get ('/ test', ...)}); ' –

+1

Если у вас есть все обработчики приложений в рамках соглашения о подключении к базе данных, это обещало вернуть что-нибудь? – ThomasReggi

2

Вот ответ от Express documentation:

app.get('/', function (req, res, next) { 
    // do some sync stuff 
    queryDb() 
    .then(function (data) { 
    // handle data 
    return makeCsv(data) 
    }) 
    .then(function (csv) { 
    // handle csv 
    }) 
    .catch(next) 
}) 

app.use(function (err, req, res, next) { 
    // handle error 
}) 

Он примечателен в основном для прохождения next через .catch() так, что общий маршрут обработки ошибок может инкапсулировать логику обработки вниз по течению ошибки.