如何在带有自定义中间件的Express路由中添加async修饰符?
解决Express路由中async与自定义中间件的兼容问题
嘿,你踩的坑我太熟了——核心问题是你把async当成了独立的中间件参数,这完全是语法用错啦!async是用来修饰路由处理函数的关键字,不能单独拎出来当参数传,得直接绑定到你的箭头函数上才行。
错误原因拆解
你原来的写法:
api.get('/users/yop', CORS(CORSOPT), async, checkauth, (req, res) => { await GETDATA.getUsers(db.collection('users')); res.json(users[req.user]); })
这里的async被当成了一个中间件函数参数,但它根本不是一个可执行的函数,自然会触发语法错误;就算编辑器没标红,await也找不到对应的async函数上下文,所以会提示“await is only valid in async function”。
修正后的正确写法
把async直接加在最后那个路由处理箭头函数前面,中间件按顺序放在参数列表里就好:
api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => { // 先接收await返回的结果,原来的users变量没定义,必须补上这一步 const users = await GETDATA.getUsers(db.collection('users')); res.json(users[req.user]); })
额外细节提醒
你原来的代码里还有个小bug:users变量没有被赋值,直接用res.json(users[req.user])会触发“users is not defined”的错误,所以一定要把await的返回结果存到变量里再使用。
原理说明
Express路由的参数逻辑是:app.get(请求路径, 中间件1, 中间件2, ..., 最终路由处理函数),前面的都是中间件函数,最后一个是处理请求的核心函数。你只需要把这个核心函数用async修饰,就能在里面正常使用await了,前面的自定义中间件(比如你的checkauth)会按顺序执行,完全不影响async函数的工作。
内容的提问来源于stack exchange,提问作者user10021033
相关产品推荐
相关产品推荐

