API调用与膝关节炎和快车的区别 以前我和Express一起工作过,现在学习膝关节炎。< /P>

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

在Express中,当我执行一个简单的get方法时。下面的代码可以工作

.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>