Node升级至v8.11.2后出现favicon.ico表不存在错误求助
嘿,这个问题我之前排查过,其实根源和Node版本升级关系不大——浏览器会自动向服务器请求/favicon.ico来获取网站图标,而你的Express应用没有专门处理这个请求,导致它被错误地传到了MySQL查询的逻辑里,才会出现“找不到favicon.ico表”的错误!
问题分析
当你在浏览器访问/account时,浏览器会发送两个请求:
- 正常的
GET /account请求(这也是你预期的,能正常返回数据) - 自动触发的
GET /favicon.ico请求(用来加载网站标签页的图标)
你的代码里只定义了/account的路由处理,没有处理/favicon.ico,如果此时你的应用有一个**通配路由(比如app.get('*', ...))**或者全局中间件把所有未匹配的请求都导向了数据库查询逻辑,就会把favicon.ico当作表名去执行SQL查询,自然就会抛出表不存在的错误。
解决步骤
这里有几个简单的方案,任选其一就能解决问题:
1. 直接处理/favicon.ico请求
在你的Express应用中添加一个专门的路由,返回无内容状态码(或者你可以返回一个实际的图标文件):
// 放在所有路由的最前面或者合适的位置 app.get('/favicon.ico', (req, res) => { res.status(204).end(); // 204表示无内容,浏览器不会再报错 });
如果有自己的图标文件,也可以这样返回:
const path = require('path'); app.get('/favicon.ico', (req, res) => { res.sendFile(path.join(__dirname, 'path/to/your/favicon.ico')); });
2. 检查并调整路由顺序
如果你用了通配路由(比如app.get('*', ...)),确保它放在所有具体路由(比如/account)的后面。这样Express会先匹配具体路由,只有当没有匹配到的时候才会走到通配路由,避免/favicon.ico请求被错误处理。
3. 排查全局中间件
检查你的代码里有没有全局的GET中间件,比如:
app.get('*', (req, res) => { // 这里执行了MySQL查询,把req.path当作表名? });
如果有这样的逻辑,一定要添加判断,排除/favicon.ico这类非业务请求。
为什么升级Node版本后才出现?
其实这个问题一直存在,只是在Node v8.9版本时,可能依赖的mysql模块或者Express的错误处理逻辑没有把这个错误暴露出来,升级到v8.11.2后,依赖包的小版本更新让错误被正确抛出了而已——核心还是路由处理的疏忽。
内容的提问来源于stack exchange,提问作者steve van christie

