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

为何Express中调用res.render响应后仍会执行后续路由中间件?

问题原因

你观察到app.get('/:id')被触发,本质上不是访问/的同一次请求导致的,res.render完成响应且未调用next()时,同请求的后续中间件/路由绝对不会执行。触发异常路由的是浏览器自动发起的其他请求,两类最常见场景:

  • 浏览器默认发送的GET /favicon.ico请求:该请求不会匹配/路由,向下匹配时会将favicon.ico作为:id参数,命中动态路由逻辑
  • 首页index.ejs中引用了不存在的静态资源:express.static中间件找不到对应资源时会调用next()继续向下匹配,最终命中动态路由:id

修复方案

  1. 优先处理favicon请求,在所有业务路由前添加如下逻辑:
app.get('/favicon.ico', (req, res) => res.status(204).end())
  1. 检查index.ejs内所有静态资源(css、js、图片等)的引用路径,确保所有资源都能在public目录下匹配到,避免无效静态资源请求向下进入业务路由。
  2. 给动态路由添加参数校验和异常处理,避免无效ID访问数据库:
app.get('/:id', (req, res, next) => {
  const id = req.params.id;
  // 校验mongoose ID格式合法性,不合法直接走404逻辑
  if (!mongoose.Types.ObjectId.isValid(id)) {
    return next();
  }
  Blog.findById(id)
    .then(data => {
      if (!data) return next();
      res.render('blog', { data });
    })
    .catch(err => next(err));
})
  1. 修正视图配置的写法,明确指定视图文件存放目录:
// 替换原有app.set('views'),路径改为你实际存放ejs文件的目录
app.set('views', './views');

内容的提问来源于stack exchange,提问作者thekensiwo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:24:01