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

Express.js中get()成功处理请求后use()仍执行?求解

问题分析与解决

首先,先帮你理清问题:你看到的use()执行,大概率不是处理根路径/的请求,而是浏览器自动发起的favicon.ico请求——这是前端开发里很容易忽略的细节!

咱们来拆解你的代码逻辑:

  • 当你访问http://localhost:xxxx/时,app.get('/')会匹配这个请求,执行res.render发送页面响应,此时这个请求的生命周期已经结束,后续的app.use()中间件不会被触发。
  • 但浏览器在加载页面时,会自动向服务器请求/favicon.ico(用来显示标签页图标),这个请求没有被你的get路由匹配到,所以会落到后面的app.use()中间件里执行,这就是你看到日志的原因。

给你两个实用的处理方案:

  • 验证请求来源:在use()中间件里打印请求路径,就能明确是哪个请求触发的:

    app.use((req, res) => {
      console.log(`use() is executed for path: ${req.path}`);
      res.end();
    });
    

    运行后你会看到日志里明确出现/favicon.ico的记录。

  • 拦截favicon请求:如果不想让这个请求触发你的通用中间件,可以专门加一个路由处理它,放在app.get('/')之后、app.use()之前:

    app.get('/favicon.ico', (req, res) => res.status(204).end());
    

    这样favicon.ico请求会被直接返回204状态码(无内容),不会走到后面的app.use()中间件。

另外补充一点:如果确实是根路径请求触发了use(),那大概率是你的res.render没有正确完成响应(比如模板渲染出错但未抛出错误),不过从你说页面正常渲染来看,这种情况可能性极低,重点还是favicon的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:07:41