API调用与膝关节炎和快车的区别 以前我和Express一起工作过,现在学习膝关节炎。< /P>
在Express中,当我执行一个简单的get方法时。下面的代码可以工作API调用与膝关节炎和快车的区别 以前我和Express一起工作过,现在学习膝关节炎。< /P>,express,async-await,koa,Express,Async Await,Koa,在Express中,当我执行一个简单的get方法时。下面的代码可以工作 .get('/applications', (req, res, next) => { const getTable = `SELECT * FROM applicationtable` db.query(getTable, values, (err, result) => { if (err) { console.log(err) }el
.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)
}
})
})
<>但是,当我尝试膝关节炎的时候,用做同样的事情。
.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中的一个显式包装膝关节炎,然后等待,然后它才会工作,如下所示:
.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中代码不必显式地包装在async await中?Koa用什么方式来表达不同于这里的例子? < P>膝关节炎都是围绕着承诺而设计的。请求处理程序本身是
async
,这意味着它返回一个承诺,当该承诺得到解决时,框架中会发生各种事情。因此,您不能将简单的异步回调与承诺自由混合
在第二个代码块的情况下,请求处理程序在调用异步回调之前返回(解析异步承诺),因此在设置ctx.body
之前返回。所以,Koa去处理请求(想想你已经完成了),但是<代码> CTX。正文< /代码>还没有设置,所以它必须是404。< /P>
将异步操作包装在承诺中,并使用wait
,然后将其链接到主请求处理程序承诺中,这样在异步操作完成之前,承诺不会解析(您想要的)
总之,对于请求处理程序中的所有异步操作,使用链接到请求处理程序的承诺(使用wait
或通过返回承诺)
这是膝关节炎开发者指南中的一个很好的例子:
另一方面,当请求处理程序返回时,Express不做任何事情。除非您调用
next()
以继续查找与其他路由处理程序的匹配项,或者调用res.send()
或一些类似的API调用来发送响应,这样您就可以在如您所示的普通异步回调中自由地执行此操作,否则它不会执行任何操作
<>这是Express和膝关节炎核心设计差异的一部分。< / P>