我有以下代码来使用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的基本知识。请帮忙。
2条答案
按热度按时间46scxncf1#
我认为你的问题更多的是理解
async
功能,而不是express和koa的细微差别。首先看一下你的文件
async
功能:异步函数声明定义了一个异步函数,它返回一个asyncfunction对象。异步函数是通过事件循环异步操作的函数,使用隐式承诺返回其结果。但是使用异步函数的代码的语法和结构更像是使用标准的同步函数。
async
函数就像语法糖:只要有await
运算符时,函数执行“冻结”并在Promise
决心。在后台,它的工作方式类似于回调,但代码更具可读性。的文档
await
操作员状态:await表达式使异步函数的执行暂停,直到一个承诺被解决,即被满足或拒绝,并在满足后继续执行异步函数。当恢复时,等待表达式的值就是已实现的承诺的值。
因此,对于koa,您的代码应该如下所示:
工作原理如下:
queries.getAll()
返回一个Promise
;await
暂停函数执行,直到Promise
决定或拒绝;当
Promise
决心,await
提取解析值并将其返回给ctx.body
;koa将自动将数据编码为json,如文档中所述:
响应。主体=
将响应正文设置为以下内容之一:
字符串写入
已写入缓冲区
流管道
对象| |数组json字符串化
空无内容响应
如果未设置response.status,koa将自动将状态设置为200或204。
还要记住
await
不暂停整个应用程序,它只暂停特定功能的执行,如果在此暂停期间发生任何事件,它将被处理。hrirmatl2#
koa允许您利用异步函数,不像express那样使用回调。如果要等待数据库查询,那么等待表达式必须在异步函数中。