处理异步函数时Express.js和koa2.js之间的区别?

问题描述 投票:2回答:2

我有以下代码使用快递设置路由器,它工作正常:

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”,如下所示:

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

这意味着在Koa2中你必须等到MySQL查询完成然后将结果发送到客户端。否则将不会发送任何内容。但是,似乎在Express中,一旦查询完成,结果将自动发送。这是为什么?也许我错过了一些关于Nodejs的基础知识。请帮忙。

javascript mysql express async-await koa
2个回答
0
投票

koa允许您利用异步函数,而不像使用回调的express。如果要等待数据库查询,则await表达式必须位于异步函数中。

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

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

0
投票

我认为你的问题更多的是关于理解async函数,而不是关于express和koa的细微差别。

首先来看看async functions的文档:

async函数声明定义了一个异步函数,它返回一个AsyncFunction对象。异步函数是一个通过事件循环异步操作的函数,使用隐式Promise返回其结果。但是使用异步函数的代码的语法和结构更像是使用标准同步函数。

async函数就像语法糖:每当有一个await运算符时,函数执行'冻结'并在Promise结算时继续。它的工作原理类似于回调,但代码更具可读性。

await operator的文档指出:

await表达式导致异步函数执行暂停,直到Promise被解析,已完成或被拒绝,并在执行后继续执行异步函数。恢复时,await表达式的值是履行的Promise的值。

因此,对于Koa,您的代码应如下所示:

router.get('/', async (ctx, next) => {
  ctx.body = await queries.getAll();
  })
}

它的工作原理如下:

  • queries.getAll()返回Promise;
  • await暂停功能执行,直到Promise解决或拒绝;
  • Promise结算时,await提取分辨值并将其返回ctx.body;
  • koa将自动将数据编码为JSON,如docs中所述:

response.body =

将响应正文设置为以下之一:

字符串写

写缓冲区

流管道

对象||数组json-stringified

null无内容响应

如果尚未设置response.status,Koa将自动将状态设置为200或204。

另外请记住,await不会暂停整个应用程序,它只会暂停特定功能的执行,如果在此暂停期间发生任何事件,它将被处理。

© www.soinside.com 2019 - 2024. All rights reserved.