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

wribegjk  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(437)

我有以下代码来使用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”,如下所示:

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

这意味着在koa2中,您必须等到mysql查询完成,然后将结果发送给客户机。否则将不发送任何内容。但是,在express中,查询完成后结果会自动发送。为什么?也许我错过了一些关于nodejs的基本知识。请帮忙。
46scxncf

46scxncf1#

我认为你的问题更多的是理解 async 功能,而不是express和koa的细微差别。
首先看一下你的文件 async 功能:
异步函数声明定义了一个异步函数,它返回一个asyncfunction对象。异步函数是通过事件循环异步操作的函数,使用隐式承诺返回其结果。但是使用异步函数的代码的语法和结构更像是使用标准的同步函数。 async 函数就像语法糖:只要有 await 运算符时,函数执行“冻结”并在 Promise 决心。在后台,它的工作方式类似于回调,但代码更具可读性。
的文档 await 操作员状态:
await表达式使异步函数的执行暂停,直到一个承诺被解决,即被满足或拒绝,并在满足后继续执行异步函数。当恢复时,等待表达式的值就是已实现的承诺的值。
因此,对于koa,您的代码应该如下所示:

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

工作原理如下: queries.getAll() 返回一个 Promise ; await 暂停函数执行,直到 Promise 决定或拒绝;
Promise 决心, await 提取解析值并将其返回给 ctx.body ;
koa将自动将数据编码为json,如文档中所述:
响应。主体=
将响应正文设置为以下内容之一:
字符串写入
已写入缓冲区
流管道
对象| |数组json字符串化
空无内容响应
如果未设置response.status,koa将自动将状态设置为200或204。
还要记住 await 不暂停整个应用程序,它只暂停特定功能的执行,如果在此暂停期间发生任何事件,它将被处理。

hrirmatl

hrirmatl2#

koa允许您利用异步函数,不像express那样使用回调。如果要等待数据库查询,那么等待表达式必须在异步函数中。

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

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

相关问题