【发布时间】:2015-05-13 13:26:16
【问题描述】:
我有一个基本的 ExpressJS 服务器,它只是用来记录连接的 IP,并提供静态页面。当我自己连接到它时会发生什么,记录请求 IP 的中间件会重复多次。如果我删除对next() 的调用,这将停止,但它也会阻止管理静态页面的中间件运行。
服务器的代码是这样的:
var express = require('express');
app = express();
app.use(function(req, res, next) {
console.log('Received a connection from: ' + req.ip)
next();
})
app.use('/', express.static(__dirname + '/public'));
var port = 55671;
app.listen(port, function() {
console.log('Listening on: ' + port);
});
如果我只连接一次,这是标准输出:
Listening on: 55671
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
Received a connection from: ::ffff:127.0.0.1
我已经尝试过中间件的不同顺序,并且我认为这在以前可以正常工作,但我可能记错了。 为什么 next() 调用在移动到另一个中间件之前多次调用一个中间件然后停止?
【问题讨论】:
-
你确定这不是所有的静态内容都下来了吗?请记住,您在提供任何静态内容之前 记录 IP,因此您将获得每个提供的静态文件的输出。
-
我提供了很多文件,所以这是有道理的。我怎么能把它改成只记录一次?我应该使用路由器而不是中间件吗?
-
这取决于您的确切意思,它按预期工作,它正在记录 IP 每个请求。您是否问是否可以在第一次请求时记录每个客户端的 IP?
-
这正是我要问的:)
-
我不确定是否有任何可用的方法,但是,一种简单的方法是维护一个活动 IP 列表(可以选择在 X 分钟后过期)并检查此列表在记录之前。参见gist 的示例,尽管可扩展性在这里可能会成为问题,但值得考虑过期问题。
标签: node.js express middleware