Я думаю, что ваш вопрос больше о понимании async
функций, чем о нюансах express и koa.
Прежде всего, посмотрите документы для async
функций :
Объявление асинхронной функции определяет асинхронную функцию, которая возвращает объект AsyncFunction. Асинхронная функция - это функция, которая работает асинхронно через цикл обработки событий, используя неявное Promise для возврата своего результата. Но синтаксис и структура вашего кода с использованием асинхронных функций намного больше похожи на использование стандартных синхронных функций.
async
функции похожи на синтаксический сахар: всякий раз, когда есть оператор await
, выполнение функции «зависает» и продолжается, когда разрешается Promise
. Под капотом он работает аналогично обратным вызовам, но код более читабелен.
Документы для await
оператора состояния:
Выражение await заставляет выполнение асинхронной функции приостанавливаться до тех пор, пока Обещание не будет разрешено, выполнено или отклонено, и возобновить выполнение асинхронной функции после выполнения. При возобновлении значение выражения await равно значению выполненного Обещания.
Так что для Коа ваш код должен выглядеть так:
router.get('/', async (ctx, next) => {
ctx.body = await queries.getAll();
})
}
Работает так:
queries.getAll()
возвращает Promise
;
await
приостанавливает выполнение функции до тех пор, пока Promise
не разрешит или не отклонит;
- , когда
Promise
разрешается, await
извлекает разрешенное значение и возвращает его ctx.body
;
- koa автоматически кодирует данные в JSON, как указано в документах :
response.body =
Задайте для тела ответа одно из следующих значений:
строка написана
Буфер написан
Поток по трубопроводу
Объект || Массив json-stringified
null no content response
Если response.status не был установлен, Koa автоматически установит статус на 200 или 204.
Также следует помнить, что await
не приостанавливает работу всего приложения, оно приостанавливает только выполнение определенной функции, и если во время этой паузы происходит какое-либо событие, оно будет обработано.