您的位置:首页 > Web前端 > Node.js

NODEJS中间件

2017-04-21 13:59 113 查看
从概念上讲,中间件是一种功能的封装方式,具体来说就是封装在程序中处理 HTTP 请求

的功能。从实战上讲,中间件只是一个有 3 个参数的函数:一个请求对象、一个响应对象

和一个 next 函数,稍后会作解释。(还有一种 4 个参数的形式,用来做错误处理,这会在

本章末尾讲到。)

中间件是在管道中执行的。你可以想象一个送水的真实管道。水从一端泵入,然后在到达

目的地之前还会经过各种仪表和阀门。这个比喻中很重要的一部分是顺序问题,你把压力

表放在阀门之前和之后的效果是不同的。同样,如果你有个向水中注入什么东西的阀门,

这个阀门“下游”的所有东西都会含有这个新添加的原料。在 Express 程序中,通过调用

app.use 向管道中插入中间件。

路由处理器( •  app.get 、 app.post 等,经常被统称为 app.VERB )可以被看作只处理特定

HTTP 谓词( GET 、 POST 等)的中间件。同样,也可以将中间件看作可以处理全部 HTTP

谓词的路由处理器(基本上等同于 app.all ,可以处理任何 HTTP 谓词;对于 PURGE 之

类特别的谓词会有细微的差别,但对于普通的谓词而言,效果是一样的)。

路由处理器的第一个参数必须是路径。如果你想让某个路由匹配所有路径,只需用 •  /* 。

中间件也可以将路径作为第一个参数,但它是可选的(如果忽略这个参数,它会匹配所

有路径,就像指定了 /\* 一样)。

路由处理器和中间件的参数中都有回调函数,这个函数有 2 个、3 个或 4 个参数(从技 •

术上讲也可以有 0 或 1 个参数,但这些形式没有意义)。如果有 2 个或 3 个参数,头两

个参数是请求和响应对象,第三个参数是 next 函数。如果有 4 个参数,它就变成了错

误处理中间件,第一个参数变成了错误对象,然后依次是请求、响应和 next 对象。

如果不调用 •  next() ,管道就会被终止,也不会再有处理器或中间件做后续处理。如果

你不调用 next() ,则应该发送一个响应到客户端( res.send 、 res.json 、 res.render 等);

如果你不这样做,客户端会被挂起并最终导致超时。

如果调用了 •  next() ,一般不宜再发送响应到客户端。如果你发送了,管道中后续的中
间件或路由处理器还会执行,但它们发送的任何响应都会被忽略。

app.use(function(req, res, next){

console.log('processing request for "' + req.url + '"....');

next();

});

app.use(function(req, res, next){

console.log('terminating request');

res.send('thanks for playing!');

// 注意,我们没有调用 next()……这样请求处理就终止了

});

app.use(function(req, res, next){

console.log('whoops, i\'ll never get called!');

});

这里有三个中间件。第一个只是在将请求传给下一个中间件之前记录一条消息。然后下一

个中间件会真正地处理请求。注意,如果我们忽略了 res.send ,则不会有响应返回到客户

端,最终会导致客户端超时。最后一个中间件永远也不会执行,因为所有请求都在前一个

中间件中终止了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: