如何正确使用异步/等待功能?

时间:2018-10-28 15:13:08

标签: javascript node.js async-await

我正在使用express在node.js服务器上工作。我这样处理POST请求:

app.post('/signup', async (req, res) => {
    let user = {
        email: req.body.userEmail,
        pass: req.body.userPass
    }
    try {
        let insertedUser = await User.create(user)
        console.log(insertedUser.get('email'))
    } catch (err) {
        console.log(`ERROR! => ${err.message}`)
    }
})

要使其正常工作,我必须将async放在回调函数之前。但是,如果app.post()已经是异步函数,为什么还要这样做呢?

我可以使用异步/等待吗?

2 个答案:

答案 0 :(得分:1)

import itertools # to make groupby work a.sort() for key,items in itertools.groupby(a): how_much = len(list(items)) if how_much > 1: print(key, "num", how_much) async/await异步无关,因为异步/等待是ES5 +引入的功能,用于以同步方式处理函数中的异步调用。可以将其视为Promises的扩展版本,就像“同步”一样,但功能相同。因此,您的代码对我来说看起来是正确的。

答案 1 :(得分:1)

您工作正常(除了您没有使用res来响应请求之外)。

您需要使用async的原因是app.post()的签名是

app.post(path: string, handler: (req: Request, res: Response) => void): void

,即两个参数,一个是一个路径,它是一个字符串,一个处理程序,它是一个接受两个参数的函数(它接受更多的参数,但是为了简单起见,我们现在忽略它们),什么都不返回。

如您所见,app.post()本身没有有趣的返回值(尤其是它不会返回Promise),因此它本身并不是异步函数。

您正在传递一个函数,该函数描述当请求到达路径时(您的情况为'/signup')要执行的操作。由于您要在该功能中使用异步功能(也称为await),因此必须将该功能标记为async


TL; DR-您的处理函数是异步的,app.post()不是。