Express-NodeJs报错:找不到模块'./favicon.ico.json'求助
问题排查与解决
核心原因
- 浏览器访问任意网页时,都会自动发送
GET /favicon.ico请求获取网站图标,你的通配路由/:translation/:book会捕获这个请求,把favicon.ico解析成translation参数,代码里尝试加载不存在的./favicon.ico.json,直接抛出模块未找到错误。 - 同时因为服务器没返回合法的favicon资源,浏览器会额外提示"需要一个favicon"。
分步解决
1. 优先拦截favicon请求
在你的通配路由之前添加专门处理favicon的路由,避免通配路由误匹配:
// 处理favicon请求 app.get('/favicon.ico', (req, res) => { // 有自定义图标就用sendFile返回,示例: // const path = require('path'); // res.sendFile(path.join(__dirname, 'public', 'favicon.ico')); // 暂时没有图标就返回204无内容,消除浏览器提示 res.status(204).end(); }); // 原通配路由放在后面 app.get('/:translation/:book', (req, res) => { const { translation } = req.params; console.log(translation); // 注意:req.params.book是字符串,要转成数字再和index比较 const bookIndex = parseInt(req.params.book, 10); const file = require(`./${translation}.json`); res.json(file.books.find((_, index) => index === bookIndex)); });
额外修正:原代码里
index === req.params.book是字符串和数字的比较,永远不会相等,改成parseInt转数字后用find(比filter更高效)获取目标项。
2. 给通配路由加参数校验(可选,增强健壮性)
通过正则限制路由参数的格式,确保只有符合预期的请求才会被匹配,比如假设translation是字母数字组合,book是数字:
// 仅匹配translation为字母数字、book为数字的请求 app.get('/:translation([a-zA-Z0-9]+)/:book(\\d+)', (req, res) => { // 原有逻辑 });
这样favicon.ico这类不符合格式的请求就不会被该路由捕获,从根源避免错误。
3. 添加实际favicon资源(可选,消除图标提示)
如果需要网站显示图标,准备favicon.ico文件放在静态资源目录(比如public),用Express静态中间件托管:
const express = require('express'); const path = require('path'); const app = express(); // 托管静态资源目录 app.use(express.static(path.join(__dirname, 'public'))); // 其他路由...
把favicon.ico放到public目录后,浏览器自动请求时就能获取到,不会再提示缺少图标。
内容的提问来源于stack exchange,提问作者sluppysluppy
相关产品推荐
相关产品推荐

