Node+Express请求重复触发循环问题求助(仅请求一次)
解决Express匹配所有请求时终端持续输出日志的问题
嘿,我来帮你搞定这个头疼的问题!你遇到的情况其实很常见,根源在于浏览器的一个默认行为——当你访问任何网页时,浏览器都会自动发送一个请求去获取/favicon.ico(网站图标)。
当你用app.get('*', ...)或者app.use(...)匹配所有请求时,这个favicon请求也会被你的路由捕获并处理。如果服务器返回的不是浏览器预期的图标文件,有些浏览器会反复发送这个请求,导致你看到终端持续输出"Request made"。而用app.get('/', ...)时,因为/favicon.ico不匹配根路径,所以只有你的主请求会触发日志,看起来就正常。
解决思路和方案
这里给你几个可行的解决方法,选哪个都能搞定问题:
1. 专门处理favicon请求,阻止浏览器重试
你可以在全局路由前,先单独处理/favicon.ico请求,返回一个无内容的响应,告诉浏览器不需要再请求了:
var express = require('express'); var app = express(); // 先处理favicon请求,返回204状态码(无内容) app.get('/favicon.ico', function(req, res) { res.status(204).end(); }); // 再匹配所有其他请求 app.get('*', function(req, res) { console.log('Request made'); res.send('Hello World!'); }); app.listen(3000, function() { console.log('Example app listening on port 3000!'); });
2. 使用Express的favicon中间件
如果你有实际的网站图标文件,可以用官方推荐的express-favicon中间件来处理,它会正确返回图标并缓存,避免重复请求:
首先安装依赖:
npm install express-favicon
然后修改代码:
var express = require('express'); var favicon = require('express-favicon'); var app = express(); // 加载favicon中间件,替换成你实际的图标路径(没有的话也可以省略路径,用默认) app.use(favicon(__dirname + '/favicon.ico')); app.get('*', function(req, res) { console.log('Request made'); res.send('Hello World!'); }); app.listen(3000, function() { console.log('Example app listening on port 3000!'); });
3. 在路由里排除favicon请求
如果你不想单独处理favicon,也可以在全局路由里判断请求路径,跳过favicon的日志输出:
var express = require('express'); var app = express(); app.get('*', function(req, res) { // 跳过favicon请求的日志 if (req.path !== '/favicon.ico') { console.log('Request made'); } res.send('Hello World!'); }); app.listen(3000, function() { console.log('Example app listening on port 3000!'); });
这样处理后,你访问localhost:3000时,终端只会输出一次"Request made",不会再出现持续输出的情况啦!
内容的提问来源于stack exchange,提问作者marcfalk
相关产品推荐
相关产品推荐

