【问题标题】:Middleware in ExpressJS app uses next() to call itselfExpressJS 应用程序中的中间件使用 next() 调用自身
【发布时间】: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


【解决方案1】:

不是 next() 多次调用 thing 。它只是让您继续前进,否则您的应用程序在第一个日志语句之后就卡住了。

但是,中间件的顺序很重要,这里将为所有访问的静态文件调用您的日志记录中间件。

如果您不想跟踪静态中间件,最好将它们放在日志中间件之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 2018-07-13
    • 2012-08-02
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多