Express路由中postAddProduct中间件未被调用问题排查求助
排查思路与解决方案
按优先级从高到低排查即可,都是这类问题的高频诱因:
- 首先查前置中间件有没有正确传递请求
Express中间件严格按注册顺序执行,排在postAddProduct前面的两个中间件(参数校验、登录鉴权)只要有一个没调用next(),请求就会被截断,根本到不了目标函数。
你可以先做个最小验证:临时把路由里两个前置中间件注释掉,直接挂载adminController.postAddProduct,发请求如果能进函数,问题百分百出在这两个前置中间件上:- 查
isAuth:鉴权成功的分支有没有漏写next(),很多人只在鉴权失败的时候写了res.redirect/res.send,成功分支忘了放行;还要检查有没有拼写错误把next写错。 - 查
addProductValidation:如果是用express-validator这类库写的校验,检查校验通过的分支有没有调用next(),有没有未捕获的校验错误直接把请求抛去了全局错误处理。
- 查
- 其次查表单请求和路由是否匹配
- 看EJS表单的
method属性是不是设的post,手滑写成get的话根本匹配不到你定义的post路由。 - 看表单
action的路径和路由是否完全一致:如果你的admin路由组挂载的时候加了/admin前缀,那表单action就得写/admin/add-product,少了前缀会匹配到别的路由去。 - 扫一遍路由文件,看有没有同路径同method的路由注册在当前路由前面,Express是从上到下匹配路由的,前面的路由如果处理了请求没放行,后面的路由不会生效。
- 看EJS表单的
- 再查函数的导入导出是否正确
确认controller文件里的导出没有被覆盖:不要在写了exports.postAddProduct = xxx之后又给exports重新赋值(比如exports = { otherFunc }),会导致路由文件里导入的postAddProduct是undefined,自然不会执行。同时确认路由文件里导入controller的路径正确,没有导错其他文件。 - 最后查上层拦截
如果上面的步骤都没找到问题,就在路由注册的最前面加个临时日志中间件:
如果控制台没打出这条日志,说明请求根本没到这个路由组,去查app入口的路由挂载配置、全局中间件(比如body解析报错、静态资源拦截之类的问题)。router.post( '/add-product', (req, res, next) => { console.log('请求到达add-product路由入口') next() }, productValidation.addProductValidation, isAuth, adminController.postAddProduct );
顺着请求链路逐段打日志,看日志卡在哪一步,问题点就在哪,比盲目改代码效率高很多。
内容的提问来源于stack exchange,提问作者yonatan Cohen
相关产品推荐
相关产品推荐

