ExpressJS独立文件async await路由中间件请求无限加载问题求助
问题原因
你遇到的无限加载问题核心是中间件的定义和注册方式不匹配:
- 你定义的
isAuthenticated是工厂函数:它本身执行后才会返回真正的Express中间件函数,但你在路由注册时直接传入了工厂函数本身,没有调用它。 - Express执行工厂函数后拿到了返回的中间件函数,但没有触发执行,也没有调用
next()将请求流转到下一个环节,导致请求一直挂起。 - 额外冗余问题:外层工厂函数的
async声明是多余的,response.json()执行后会自动结束响应,不需要手动调用response.end()。
修复方案
有两种可选修复方式,按需选择即可:
方式1:简化中间件定义(推荐,无参数场景用这个更简洁)
直接导出异步中间件函数,不需要外层的工厂包装,修改isAuthenticated.js代码:
const Auth = require('../auth/auth') // 直接导出异步中间件函数 const isAuthenticated = async (request, response, next) => { const token = request.cookies.token; try { const JWTVerify = await Auth.verifyJWTToken(token); next() } catch (error) { response.json({ status: "failed", message: "Authentication failed invalid token" }); } } module.exports = isAuthenticated
Server.js代码无需修改,原有注册逻辑即可正常运行。
方式2:保留工厂函数形式(适合需要给中间件传自定义参数的场景)
不需要修改中间件文件,只需修改Server.js的路由注册逻辑,调用工厂函数拿到真正的中间件:
const isAuthenticated = require('./middleware/isAuthenticated') // 调用isAuthenticated()获取实际中间件 app.post('/some-route', isAuthenticated(), async (request, response) => { // 路由业务逻辑 });
补充说明
异步中间件可以正常在Express中使用,建议配合全局错误处理中间件捕获未处理的异步异常,避免服务意外崩溃。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

