Разница между Express.js и koa2.js при обработке асинхронной функции? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующий код для установки маршрутизатора с помощью Express, и он отлично работает:

router.get('/',(req,res)=>{
    queries.getAll().then(stickers=>{
        res.json(stickers)
    })
})

queries.getAll() - это функция, которая будет выполнять запрос MySQL и получать нужные мне данные стикеров. Однако, когда я использую koa2 для написания чего-то похожего, это не сработает:

router.get('/', async (ctx, next) => {
    queries.getAll().then(stickers=>{
    ctx.body = JSON.stringify(stickers)
    })
}

Насколько я знаю, я должен поставить "ожидание" перед функцией запроса, например:

await queries.getAll().then(stickers=>{
ctx.body = JSON.stringify(stickers)
})

Это означает, что в Koa2 вы должны дождаться завершения запроса MySQL и затем отправить результат клиенту. В противном случае ничего не будет отправлено. Однако, похоже, что в Express результат будет автоматически отправлен, как только запрос будет завершен. Это почему? Может быть, я упускаю некоторые основы о Nodejs. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я думаю, что ваш вопрос больше о понимании 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 не приостанавливает работу всего приложения, оно приостанавливает только выполнение определенной функции, и если во время этой паузы происходит какое-либо событие, оно будет обработано.

0 голосов
/ 05 сентября 2018

koa позволяет использовать асинхронные функции в отличие от экспресса, который работает с обратными вызовами. если вы хотите ожидать запросов к базе данных, то выражение await должно быть внутри асинхронной функции.

const Koa = require('koa');
const app = new Koa();

app.use(async (ctx, next) => {
  let res = await queries.getAll();
  res.then(
    //do stuff
  )
});
...