我有以下代码使用快递设置路由器,它工作正常:
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的基础知识。请帮忙。
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
)
});
我认为你的问题更多的是关于理解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
;response.body =
将响应正文设置为以下之一:
字符串写
写缓冲区
流管道
对象||数组json-stringified
null无内容响应
如果尚未设置response.status,Koa将自动将状态设置为200或204。
另外请记住,await
不会暂停整个应用程序,它只会暂停特定功能的执行,如果在此暂停期间发生任何事件,它将被处理。