различия между вызовами API с Koa и Express - PullRequest
0 голосов
/ 26 сентября 2019

Раньше я немного работал с Express и теперь изучаю Koa.

В Express, когда я использовал простой метод get.Следующий код работает

.get('/applications', (req, res, next) => {
    const getTable = `SELECT * FROM applicationtable`
    db.query(getTable, values,  (err, result) => {
        if (err) {
            console.log(err)
        }else {
            res.json(result)
        }
    })       
})

Однако, когда я попытался сделать то же самое в Koa с

.get('/applications', (ctx, next) => {
    const getTable = `SELECT * FROM applicationtable`
    db.query(getTable, values,  (err, result) => {
        if (err) {
            console.log(err)
        }else {
            ctx.body = result
        }
    })       
})

, он возвращает ошибку 404.Я должен явно обернуть вышеупомянутое в Koa обещанием и поставить async await, тогда только он будет работать, как показано ниже:

.get('/applications', async(ctx, next) => {
    const getTable = `SELECT * FROM applicationtable`
    const item = await new Promise(function(resolve, reject) {
        db.query(getTable,  (err, result) => {
            if (err) {
                reject(err)
            }else {
                resolve(result)
            }
        })
    })      
    ctx.body = item;
})

Мой вопрос заключается в том, почему в Express код не должен бытьявно завернутые в асинхронное ожидание?Каким образом Коа ведет себя не так, как Экспресс с примерами здесь?

1 Ответ

0 голосов
/ 26 сентября 2019

Коа спроектирован на основе обещаний.Сам обработчик запроса - 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.

...