Node.js:如何在Express的所有HTTP请求中执行某些操作?

41
我想要做类似这样的事情:
app.On_All_Incoming_Request(function(req, res){
    console.log('request received from a client.');
});

当前的app.all()需要一个路径,如果我例如提供这个/,那么它只在我在主页时工作,所以它并不是真正的“all”。

在普通的node.js中,只需在创建http服务器之后,在进行页面路由之前编写任何内容即可。

那么我该如何在express中实现这一点,最好的方法是什么?


这是我写的一个关于编写Express中间件的教程,以实现此目的。 - mguida
4个回答

58

Express基于Connect中间件。

Express的路由能力是由你的应用程序中的router提供的,你可以自由地向应用程序添加自己的中间件。

var app = express.createServer();

// Your own super cool function
var logger = function(req, res, next) {
    console.log("GOT REQUEST !");
    next(); // Passing the request to the next handler in the stack.
}

app.configure(function(){
    app.use(logger); // Here you add your logger to the stack.
    app.use(app.router); // The Express routes handler.
});

app.get('/', function(req, res){
    res.send('Hello World');
});

app.listen(3000);

就是这么简单。

(PS:如果你只想要一些日志记录,可以考虑使用Connect提供的日志记录器。)


嘿,那真的很容易。我使用Node.js的Express有一段时间了,但我从来没有想过这个 :-) 谢谢兄弟! - Adam Halasz
1
但是,@Raynos难道不需要经过路由处理和正则表达式等步骤吗? - Adam Halasz
@CIRK 将中间件添加到 app.router 而不是服务器。我怀疑它的效率显著降低。 - Raynos
6
@Raynos,我觉得你应该添加一个使用 app.all("*", cb) 解决方案的答案,并讨论为什么/为什么不使用它(我假设大多数情况下是出于风格考虑)。了解选项是相关的。 - Niels Abildgaard
connect.logger 现在已经更名为 morgan。 可以使用类似 app.use(require('morgan')('combined')); 的方式来记录日志。 - CrazyPyro
3
app.configure 不是一个函数? - theonlygusti

11
您应该这样做:
app.all("*", (req, res, next) => {
    console.log(req); // do anything you want here
    next();
});

4
您可以通过引入中间件函数来实现。使用app.use(your_function)有所帮助。app.use接受一个函数,该函数将在服务器记录的每个请求上执行。例如:
app.use((req, res, next) => {
    console.log("req received from client");
    next(); // this will invoke next middleware function
});

2
Express支持路由路径中的通配符wildcards in route paths。因此app.all('*', function(req, res) {})是一种方式。
但这仅适用于路由处理程序。区别在于,Express路由处理程序需要发送响应,如果没有发送响应,Express将永远不会发送响应。如果您想要进行某些操作而不显式地发送响应,例如检查标题,您应该使用Express middlewareapp.use(function(req, res, next) { doStuff(); next(); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接