做nodejs开发离不开Express的引用,通过Express可以更加简单的实现客户端的请求和服务端的响应,原因在于Express在Node.js的HTTP模块上添加了一个中间件,那么,所谓的中间件是什么呢?
以下是一些浅显的理解:

中间件可以看做是处理HTTP请求的一种封装,也可以理解为一个函数,可以通过某个对象调用,它有三个参数:请求对象req、响应对象resnext函数。

中间件是在管道pipe中执行的,了解Linux的小伙伴应该知道管道运算机制,数据从首端流入,末端流出,数据可以在注入端向下传递,这里面套路很深,就不做过多扩展了。在Express中,通过调用
app.use向管道中注入中间件。

在管道的最后,通常放一个“捕获一切”的处理请求,由它来处理所有跟前面都不匹配的路由请求,这个中间件一般返回状态码“404”。如果该中间件函数没有传入next函数,不调用next函数,请求就在
当前所在的中间件终止了。

我们需要灵活运用中间件和路由处理器,需要知道Express几个关键之处:

  • 路由处理器:app.getapp.post等,统称为app.verb,这也是中间件的一种,只处理特定方式的HTTP请求,路由处理器的第一个参数必须是路径,如果想匹配所有路径,只需用/*
  • 路由处理器和中间件的参数中,都有回调函数,参数个数不固定,通常是2个、3个或4个。常用的2个或3个参数,第一个是网络请求req,第二个是响应对象res,第三个是next()函数。
  • 如果是4个参数,它就变成了错误处理中间件,第一个参数变成了错误对象,然后依次是上面的三个。
  • 如果不调用next()函数,管道就会被终止,也不会再有处理器或中间件的后续处理。如果不调用next()函数,则应该发送一个响应给客户端,常用的有三种格式:res.sendres.jsonres.sender等。如果不这样做,客户端就会被挂起,并最终导致超时。
  • 如果调用了next()函数,一般不宜再发送响应给客户端,这是因为如果发送了响应,管道中的后续中间件或处理器还会执行,但它们发送的任何响应都会被忽略。

简单来说,中间件(Middleware)就是处理HTTP请求的函数,它的最大特点是,一个中间件处理完,再传给下一个中间件,应用程序在运行过程中,会调用一系列的中间件。如下是一个中间件。

1
2
3
4
function funMiddleware(req, res, next){
//...
next();
}

每个中间件可以从APP实例中接受三个参数,依次是:request对象(HTTP请求)、response对象(HTTP响应)、next函数(表示下一个中间件)。每个中间件都可以对HTTP请求进行判断,从而决定是否进入下一级,
将request对象传给下一个中间件,参数中的next就是这个意思。

下面举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
app.use(function(req, res, next){
console.log('processing request for '+ req.url);
next();
})
app.use(funciton(req, res, next){
console.log('terming request');
res.send('thinks for playing!');
//这里没有调用next(),请求终止
})
app.use(function(res, req, next){
console.log('I never get called!');
})

这里用到三个中间件:第一个中间件只是输出一个log信息,并把请求传给了下一个中间件;第二个中间件真正的处理请求,注意,如果忽略res.send(),客户端就会被挂起,导致客户端等待超时;第三个中间件永远也不会执行,应为所以请求在上一个中间件终止了。