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
相关产品推荐
相关产品推荐

