Nodejs中间件

Express 中间件 Middleware

概念:与污水处理类似,污水到净水,中间经过多道处理流程,这样的中间处理环节,就叫做中间件

1 express中间件的调用流程

当请求到达express服务器,中间件1、中间件2、中间件3。。。处理完毕响应到客户端

2 中间件格式

本质就是一个function处理函数

const express = require('express')

const app = express()

app.get('/',function(req,res,next) {}) //function 里面多了一个形参next

app.listen(80,()=>{})

2.1 next函数的作用

实现多个中间件连续调用的关键,next函数表示传递给下一个中间件或路由

2.2定义中间件

const express = require('express')

const app = express()

const mw = function(req,res,next) {

    console.log('这是最简单的中间件函数')


    next()

}

//将mw注册为全局生效的中间件

app.use(mw)

app.listen(80,()=>{

    console.log('http://127.0.0.1')

})

2.3全局生效的中间件

通过app.use(中间件函数),即可定义一个全局生效的中间件,通过next() 传递下去

,中间件仅仅是多了一个next

app.use((req,res,next)=>{

console.log('这是一个最简单的中间件函数')

next()  // 这个next是关键

})

2.4 中间件的作用

多个中间件之间共享同一份req与res ,这样可以在上游的中间件中,为req或res对象添加自定义的属性或方法,供下游的中间件或路由使用

const express = require('express')

const app = express()

app.use((req,res,next)=> {

console.log('调用了第1个中间件')

})

app.use((req,res,next)=> {

console.log('调用了第2个中间件')

})

//定义一个路由

app.get('/get',(req,res)=>{

res.send('User page.')})

app.listen(80,()=> {

console.log('http://127.0.0.1')

})

2.5 局部生效的中间件

不使用app.use() 叫做局部生效的中间件

const mw = function(req,res,next){

console.log('随便意思一下')

next()

}

app.get('/',mw,function(req,res) {    // 这就是局部生效的中间件,中间函数可以写任意多个,按顺序依次执行

              =---------app.get('/',[mw1,mw2,mw3,mw4],function(req,res) {    // 这就是局部生效的中间件,中间函数可以写任意多个,按顺序依次执行

res.send('Home page')

}) 

2.6 中间件使用注意事项

1 先写中间件后路由

2 重点!!! 不要忘记next() ,调用完next()后在中间件中不要再写代码

3 多个中间件 req和res是共享的

2.7 中间件的使用

应用、路由、错误、内置、第三方

2.7.1 应用级别中间件

绑定到app实例上就是应用级中间件

2.7.2路由级别的中间件

express.Router()实例上的中间件

const app = express()

const router = express.Router()

router.use((req,res,next)=>{

console.log('意思意思')

next()

})

app.use('/',router)

2.7.3 错误级别中间件

用于捕获异常错误,必须有4个形参,分别是 (err,req,res,next)

const express = require('express')

const app = express()

//定义一个路由

app.get('/',(req,res)=>{

throw new Error('服务器内部发生了错误!')

res.send('home page')

})

//定义错误级别中间件,防止错误引发崩溃,错误级别的中间件注册再所有路由之后!!

app.use((err,req,res,next)=> {

console.log('发生了错误!'+err.message)

res.send('Error:'+err.message)

})

app.listen(80,()=> {

console.log('http://127.0.0.1')

})

2.7.4 express内置中间件

express.static  托管静态资源//任何版本都可以使用

express.json 解析Json格式的请求

app.use(express.json())

示例:

const express = require('express')

const app = express()

app.use(express.json()) // 解析了json数据  req.body 可以访问到数据了

app.post('/user',(req,res)=>{

//在服务器,可以通过req.body来接收客户端发送过来的请求数据,需要配置中间件

res.send('ok')})

app.listen(80,function(){

console.log('http://127.0.0.1')

})

---------------------------------------------------------------

express.urlencoded 解析URL-encoded格式的请求数据

app.use(express.urlencoded({extended:false})) //固定写法 配置解析application/x-www-form-urlencoded 格式数据的中间件

示例:

const express = require('express')

const app = express()

app.use(express.urlencoded({extended:false})) //固定写法,这样就可以解析urlencoded格式数据

app.post('/user',(req,res)=>{

//在服务器,可以通过req.body来接收客户端发送过来的请求数据,需要配置中间件

console.log(req.body)

res.send('ok')

})

app.listen(80,function(){

console.log('http://127.0.0.1')

})

3 自定义中间件

手写一个express.urlencoded 这样的中间件

3.1实现步骤:定义中间件、监听req的data事件、监听req的end事件、使用querystring模块解析请求体数据、将解析出来的数据对象挂载为req.body、将自定义中间件封装为模块

3.2代码

const express = require('express')

const app = express()

const qs = require('querystring') //内置,一会调用qs.parse()

// 模拟接收数据

app.use((req,res,next) => {

//定义一个str字符串

let str = ''

//监听req的data事件

req.on('data',(chunk)=>{

str+= chunk

  })

//监听req的end事件

req.on('end',()=>{

//str中是完整的请求体数据

const body = qs.parse(str)    //3.3解析

req.body= body    //3.4 将body 挂载到req

  })

})

app.listen(80,function(){

console.log('http://127.0.0.1')

})

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容