Express框架进阶-2---中间件

中间件函数在应用的request--reponse周期中,能够使用request对象(req)、response对象(res)和next函数(next)。能够实现如下功能

  • 执行逻辑代码;
  • 更改request对象和response对象;
  • 结束request--reponse周期;
  • 调用栈中的下一个中间件。
    tips: 如果当前的中间件函数没有结束request--reponse周期,则必须调用next(),将控制权交给下一个中间件函数,否则请求将被挂起。 执行逻辑代码的中间件的顺序需要在路由handler之前,否则不会执行其代码,因为路由handler会结束掉这个request-response cycle
    Express的应用可以使用以下类型的中间件:
  • 应用级别中间件
  • 路由级别中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

可以使用可选的挂载路径(不配置挂载路径的话默认挂载在根目录下/) 加载应用级别和路由级别的中间件 。也可以加载一系列的中间件函数,这样会在挂载点创建一个中间件系统的子堆栈。

1. 应用级别中间件

将应用级别的中间件绑定到Express实例--app上,使用app.use()app.METHOD(此METHOD指get、post等方法)
tips: 从一个路由到另一个路由(路由使用app.METHOD或router.METHOD定义的),使用next('route')

app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // send a regular response
  res.send('regular')
})

// handler for the /user/:id path, which sends a special response
app.get('/user/:id', function (req, res, next) {
  res.send('special')
})
2. 路由级别中间件

同应用级别的中间件用法相同,不同之处的是它是绑定在router实例(express.Router())上的
tips: 同样也可以使用next('route') 从一个路由到另一个路由(另一个路由使用router.METHOD定义的)

3. 错误处理中间件

与其他中间件函数的定义基本相同,不同之处在于错误处理函数多了一个变量:err,即它有4个变量:err, req, res, next

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

tips: next() 传入的参数除了字符串'route'外,其他参数会认为出错,交由错误处理函数处理。若未显式定义错误处理函数,则函数集的末尾有express隐式包含的默认错误处理程序。

4. 内置中间件

express.static()、express.json()、express.urlencoded()等

5. 第三方中间件

如操作cookie的cookie-parser
读取解析的cookie用req.cookies(读取被签名的cookie用req.signedCookies),读取cookie字符串用express的req.headers.cookie;
设置cookie用express的res.cookie(key, value)或res.header('Set-Cookie', 'key=value');

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
app.use('cookieParser ');
app.get('/', function(req, res, next){
  console.log(req.cookies); // 解析过的object的形式--{ k1: 'v1', k2: 'v2' }。引入了cookie-parser方可使用
  console.log(req.headers.cookie);// string的形式--k1=v1; k2=v2。express原生可以用
  res.cookie('key3', 'val3'); // 设置cookie,express原生可以用
  res.send('cookie example');
})

tips:使用session可以用express-session中间件,默认是存储在内存中,server重启后会丢失,不适用于生产环境。可以通过设置store参数 将session内容存储在数据库中。

tips:关于安全问题的两点:

  • app.disable('x-powered-by'); reponse中不会返回X-Powered-By字段(如果不做设置会返回server的类型,如X-Powered-By: Express,可能导致针对性的攻击);
  • 使用session时,将cookie中sessionid的key设置为通用的字符串如sessionID(不设置的话sessionid默认的key为connect.sid),同上一条的原因一样,防止黑客针对你的后台类型进行针对性攻击。
app.use(session({
  name : 'sessionId',
  resave:false,
  saveUninitialized: false
}));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容