node.js(3):使用Express开发中的中间件
在其他的开发语言比如C#的ASP.net中,中间件是指业务处理中使用到的组件或者模型。
在Node.js的Express中,就是指在业务处理流程中系统使用到的“组件”,不过,这个“组件”指的是函数而已。
当我们使用Express开发了一个网站,服务器接收到一个来自客户端浏览器的请求之后,最简单的情形就是经过一个函数处理后就返回结果,而普遍存在的场景却是需要连续调用多个处理函数(中间件,middleware)后才能给客户端返回结果。
比如,做提取来自客户端的基础信息(IP地址、访问时间、请求的源地址等)、安全检测、记录日志、通讯处理及消息传递等等,这些处理需求对于一个稍微大一点的网站几乎是必须的,这些就可以写成中间件,我们在开发过程中就可以很方便地使用它们从而对来自浏览器端的请求逐一做想要的预处理。
在Node.js的Express中,多个中间件之间,共享同一份的req(request)和res(response),并且在前面使用的中间件中,可以为req和res添加自定义的属性或者方法,以便让后面的中间件进行使用。
1、Express中间件的格式:(app为Web服务器的实例对象)
app.post(‘路由请求’,(req,res,next)=>{//处理//移交给下一个中间件或者路由next()
})
2、在Express中,中间件分局部生效的中间件和全局生效的中间件。
① 局部生效的中间件
const ztb_mw1=function(req,res,next){console.log(‘局部生效的中间件1’)next()
}
const ztb_mw2=function(req,res,next){console.log(‘局部生效的中间件2’)next()
}
app.post(‘/ZTB’,ztb_mw1,ztb_mw2,function(req,res){res.send(‘这是经过两个中间件处理后的结果’)
}
上面的等价形式:
app.post(‘/ZTB’,[ztb_mw1,ztb_mw2],(req,res)=>{res.send(‘这是经过两个局部生效的中间件处理后的结果’)
}
② 全局生效的中间件
app.use(function(req,res,next){console.log(‘这是全局生效的中间件1’)next()
})
app.use(function(req,res,next){console.log(‘这是全局生效的中间件2’)next()
})
app.post(‘/ZTB’,(req,res)=>{res.send(‘这是经过两个全局中间件处理后的结果’)
}
3、中间件分为5大类:
① 处理一般应用的中间件:
通过app.post()、app.get()或者app.use()绑定到app实例上的中间件。
② 处理路由的中间件:
绑定在router实例上的中间件,router为路由实例对象
③ 处理错误的中间件
处理错误的中间件,有4个参数,分别是err,req,res,next,这个中间件必须注册在所有的路由之后。
④ Express的内置中间件
比如express.json、express.urlencoded等,其中express.json用于解析JSON格式的请求体数据(在Express 4.16版本之后),express.urlencoded用于解析URL-encoded格式的请求体数据。
⑤ 第三方的中间件
这个有很多,使用类同于express的内置组件。
4、定义中间的注意事项:
① 一定要在路由之前注册中间件;
② 对于同样的请求,可以连续调用多个中间件
③ 执行完中间件,最后一定要调用next()函数
④ 连续调用的多个中间件之间共享同一份的req和res对象
主文件ZTB_Main.js代码:
//导入express模块
const express=require('express')
//创建Web服务器
const app=express()//配置解析application/json格式的数据的中间件
app.use(express.json())//配置解析application/x-www-form-urlencoded格式数据的中间件
app.use(express.urlencoded({extended:false}))//导入自定义的路由模块
//自定义模块必须加上路径名,文件后缀可以省略,内置模块和下载的第三方模块不需要加
const ZTB_router=require('./ZTB_router.js')//导入中间件模块
const ZTB_mw=require('./ZTB_mw.js')//注册中间件
app.use(ZTB_mw.ZTB_mw1)
app.use(ZTB_mw.ZTB_mw2)//注册一个局部路由模块
app.use('/ZTB/update',ZTB_mw.ZTB_mw3,ZTB_router)//注册全局路由模块
app.use('/ZTB',ZTB_router)//启动web服务器
app.listen(9019,()=>{console.log('Web服务器正在运行......http://127.0.0.1:9019')
})
中间件文件ZTB_mw.js代码:
//导入express
var express=require('express')function ZTB_mw1(req,res,next){console.log('获取客户端的信息')next()
}function ZTB_mw2(req,res,next){console.log('安全检测')next()
}function ZTB_mw3(req,res,next){console.log('日志处理')next()
}//对外共享中间件
module.exports={ZTB_mw1,ZTB_mw2,ZTB_mw3
}
路由文件ZTB_router.js代码:
//导入express
var express=require('express')
//创建路由对象
var router=express.Router()router.get('/add',function(req,res){//处理增加//返回结果console.log('增加操作')res.send('增加操作')
})router.post('/del',function(req,res){//处理删除//返回结果console.log('删除操作')res.send('删除操作')
})router.post('/update',function(req,res){//处理删除//返回结果console.log('更新操作')res.send('更新操作')
})//对外导出路由对象
module.exports=router
结果:
node.js(3):使用Express开发中的中间件相关推荐
- Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]
对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案. 接下来,我们谈谈整个技术选型历程, ...
- Node.js(MEAN)全栈开发入门-安晓辉-专题视频课程
Node.js(MEAN)全栈开发入门-28082人已学习 课程介绍 本课程从Node.js切入,以实现一个Web管理系统为目标,以点带面地介绍MEAN技术栈(MongoDB+Expr ...
- 基于Node.js平台的Express教程
基于Node.js平台的Express教程 Express 简介 什么是 Express Express 能做什么 Express 的基本使用 安装 Express 创建基本的 Web 服务器 监听 ...
- node.js之全栈开发
node.js之全栈开发 1.为什么要学习Node.js Node.js是什么 Node能做什么 一些资源 学习到什么 2.Node 2.1起步 安装Node环境 解析执行JavaScript 2.2 ...
- Node.js CQRS 幻灯片系统开发实战-曾亮-专题视频课程
Node.js CQRS 幻灯片系统开发实战-328人已学习 课程介绍 通过 Node.js . Express 和 CQRS 技术开发幻灯片系统. 我们已经习惯于 MVC 开发,也都 ...
- 如何把 Node.js 嵌入自己的项目中
Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中. 首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装.这样 ...
- 使用node js 和天猫精灵 开发交互
这里写自定义目录标题 使用node js 和天猫精灵 开发交互 准备工作 最好的教程 使用node js 和天猫精灵 开发交互 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你 ...
- 如何在Node.js上的Express.js中获取GET(查询字符串)变量?
是否可以像在PHP的$_GET中那样在Node.js的查询字符串中获取变量? 我知道在Node.js中,我们可以在请求中获取URL. 有没有获取查询字符串参数的方法? #1楼 2014年5月4日更新 ...
- 唤醒手腕 - 前端服务器端开发 Node.Js 学习笔记(学习中,更新中)
唤醒手腕 - Node.Js 学习笔记 唤醒手腕个人的学习记录,时间在2021年12月13日 ~ 2021年12月14日,学习方式看官方文档和B站视频,如有错误或者代码问题的地方,欢迎C站大佬能够帮忙 ...
最新文章
- 巧用宏定义进行调试 (转)
- 【好用的.vimrc】支持vim语法高亮,保留上一次编辑内容,记住位置等配置
- 配置web site 在IIS 6.0
- 用gdb调试core文件
- 日志文件切割服务logrotate配置及crontab定时任务的使用
- C语言课程设计---歌厅歌曲管理系统
- $.ajax注册表单
- 玩转Nacos参数配置!多图勿点
- 如何在linux系统写程序文件,Linux应用程序使用写文件调试程序的方法
- OpenShift 4 之Istio-Tutorial (4) 流量控制和灰度发布
- F-Spot 0.3.2
- java容器输入_Java 容器初识篇
- 解决Odoo出现的Unable to send email, please configure the sender's email address or alias.
- Office 365管理员指引 7 ——Lync 用户配置
- 谈谈网络通信中的 ACK、NACK 和 REX
- 功能自动化测试的策略有哪些?
- MFC软件常见问题解决
- win8计算机可用内存不足,win8电脑运行提示物理内存不足的解决方法
- JAVA学习:将字符串转成数字
- hdu1002 a+bII 大数相加
热门文章
- 天梯赛-练习集L1-006 连续因子 (20分)【orz小辣鸡第一次写题解
- GreenDao3.0+库,轻松搞定安卓数据库操作
- 【Source教程】文章目录
- 【IoT】 产品设计之结构设计:PMMA(亚克力)板、PC耐力板、PS有机板与MS板区别
- Java导出主表和明细Excel
- 一段声波就能清理手机喇叭灰尘,你也试试吧!
- clearRect()不能清楚路径
- 使用python实现3D点云算法模型
- 激活层是每一层都有吗_每一个成功男人的背后,都有一个特别的妻子吗?
- 《人工智能-处女篇(AI2026)》(Unity+SteamVR+5G+AI+VR云游戏+AlphaGo+神经网络+深度学习+机器学习+图像识别+CNN+自动驾驶+智能机器人+立钻哥哥+==)