Коа спроектирован на основе обещаний.Сам обработчик запроса - async
, что означает, что он возвращает обещание, и в рамках этого решения происходят различные вещи, когда это обещание разрешается.Таким образом, вы не можете свободно смешивать простые асинхронные обратные вызовы с обещаниями.
В случае вашего второго блока кода ваш обработчик запросов возвращает (что разрешает асинхронное обещание) ДО того, как ваш асинхронный обратный вызов будет вызван и, следовательно, передВы установили ctx.body
.Итак, Коа обрабатывает запрос (думая, что вы сделали), но ctx.body
еще не установлен, поэтому он полагает, что это должно быть 404.
Завершение асинхронной операции в обещании и использование await
с этим, затем объединяет его в основное обещание обработчика запросов, чтобы обещание не разрешалось до тех пор, пока ваша асинхронная операция не будет выполнена (что вы хотите).
Итог, используйте обещания, которые связаны с запросомобработчик (либо с помощью await
, либо путем возврата обещания) для всех ваших асинхронных операций в обработчике запросов.
Вот хороший небольшой пример в руководстве разработчика Koa: https://github.com/koajs/koa/blob/master/docs/guide.md#async-operations
Экспресс, с другой стороны, ничего не делает, когда ваш обработчик запросов возвращается.Он ничего не делает, пока вы не вызовете next()
для продолжения поиска совпадений с другими обработчиками маршрутов или не вызовете res.send()
или какой-либо подобный вызов API, который отправляет ответ, так что вы можете сделать это простым асинхронным обратным вызовом, таким каквы показываете.
Это часть основного конструктивного различия между Express и Koa.