You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:36:01