JWT Express中间件验证通过后返回404错误,求排查问题
问题分析与解决
你的问题出在处理函数导出时的语法错误,导致token验证通过后请求无法匹配到正确的处理逻辑,最终返回404。
错误原因
你写的exports.test = jwtMiddleware, (req, res) => {...}使用了JavaScript的逗号运算符,这个运算符会返回最后一个表达式的值——也就是后面的箭头函数,jwtMiddleware并没有被纳入请求处理链中。虽然你提到token错误时返回符合预期(可能是全局应用了中间件或代码书写误差),但验证通过后next()调用无法找到后续处理逻辑,最终返回404。
修正方案
以下是几种正确的写法:
方案1:直接在路由中传递中间件和处理函数
去掉单独的exports.test定义,直接在路由配置里分开传递:
// 路由配置 router.post("/composer/test", jwtMiddleware, (req, res) => { res.status(200).send({ message: "Success" }); });
方案2:用数组包装中间件和处理函数后导出
将中间件和业务处理函数放在数组中导出,express会自动按顺序执行:
// 导出处理链 exports.test = [jwtMiddleware, (req, res) => { res.status(200).send({ message: "Success" }); }]; // 路由配置(两种写法都可行) router.post("/composer/test", middleware.test); // 或者展开数组:router.post("/composer/test", ...middleware.test);
方案3:手动组合中间件(不推荐)
如果一定要合并成单个函数,可以手动调用中间件并传递自定义的next逻辑:
exports.test = (req, res, next) => { jwtMiddleware(req, res, () => { res.status(200).send({ message: "Success" }); }); };
额外检查
如果修正后仍有404,确认路由挂载路径是否正确:比如如果你的router是通过app.use('/api', router)挂载的,实际请求路径应为/api/composer/test,而非直接/composer/test。
内容的提问来源于stack exchange,提问作者Morris
相关产品推荐
相关产品推荐

