Node.js + Express中间件详解
使用中间件
Express是一种路由和中间件Web框架,它具有自己的最小功能:Express应用程序本质上是一系列中间件函数调用。
中间件函数是可以访问请求对象 (req),响应对象(res)以及应用程序的请求 - 响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为的变量表示next。
中间件功能可以执行以下任务:
执行任何代码。
更改请求和响应对象。
结束请求 - 响应周期。
调用堆栈中的下一个中间件函数。
如果当前的中间件函数没有结束请求 - 响应周期,则必须调用next()以将控制传递给下一个中间件函数。否则,请求将被挂起。
Express应用程序可以使用以下类型的中间件:
您可以使用可选的装载路径加载应用程序级和路由器级中间件。您还可以将一系列中间件功能加载在一起,从而在安装点创建中间件系统的子堆栈。
应用程序级中间件
通过使用和函数将应用程序级中间件绑定到app对象的实例,其中是中间件函数以小写形式处理的请求的HTTP方法(例如GET,PUT或POST)。app.use()app.METHOD()METHOD
此示例显示了没有装载路径的中间件功能。每次应用程序收到请求时都会执行该功能。
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
此示例显示了/user/:id路径上安装的中间件功能。对/user/:id路径上的任何类型的HTTP请求执行该函数。
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
此示例显示了路由及其处理函数(中间件系统)。该函数处理对/user/:id路径的GET请求。
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
下面是一个使用挂载路径在挂载点加载一系列中间件函数的示例。它说明了一个中间件子堆栈,它将任何类型的HTTP请求的请求信息打印到/user/:id路径。
app.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
路径处理程序使您可以为路径定义多个路径。下面的示例为/user/:id路径的GET请求定义了两个路由。第二个路由不会引起任何问题,但它永远不会被调用,因为第一个路由结束了请求 - 响应周期。
此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id)
next()
}, function (req, res, next) {
res.send('User Info')
})
// user/:id路径的处理程序,用于打印用户标识
app.get('/user/:id', function (req, res, next) {
res.end(req.params.id)
})
要从路由器中间件堆栈中跳过其余的中间件功能,请调用next('route')将控制权传递给下一个路由。 注意:next('route')仅适用于使用app.METHOD()或router.METHOD()函数加载的中间件函数。
此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。
app.get('/user/:id', function (req, res, next) {
// 如果用户ID为0,则跳到下一个路由
if (req.params.id === '') next('route')
// 否则将控件传递给此堆栈中的下一个中间件函数
else next()
}, function (req, res, next) {
// 返回数据信息
res.send('regular')
})
// user/:id路径的处理程序,它发送一个特殊的响应
app.get('/user/:id', function (req, res, next) {
res.send('special')
})
路由器级中间件
路由器级中间件的工作方式与应用程序级中间件的工作方式相同,但它绑定到的是一个实例express.Router()。
var router = express.Router()
使用router.use()和router.METHOD()函数加载路由器级中间件。
以下示例代码通过使用路由器级中间件复制上面显示的应用程序级中间件的中间件系统:
var app = express()
var router = express.Router() // 没有挂载路径的中间件功能。 对于路由器的每个请求都执行此代码
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
}) // 对/ user/:id路径的任何类型的HTTP请求的都会执行
router.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next()
}) // 用于处理对/ user /:id路径的GET请求
router.get('/user/:id', function (req, res, next) {
// 如果用户ID为0,则跳到下一个路由器
if (req.params.id === '') next('route')
// 否则将执行下一个中间件函数
else next()
}, function (req, res, next) {
// 渲染regular页面
res.render('regular')
}) // / user /:id路径的处理程序,它会渲染页面
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id)
res.render('special')
}) // 初始化引入router中间件
app.use('/', router)
要跳过路由器中间件的其余功能,请调用next('router') 将控制权交还给路由器实例。
此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。
var app = express()
var router = express.Router() // 在需要时对路由器的检查
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
}) router.get('/', function (req, res) {
res.send('hello, user!')
}) // 使用路由器和设置请求结果状态码
app.use('/admin', router, function (req, res) {
res.sendStatus()
})
错误处理中间件
错误处理中间件总是需要四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使您不需要使用该next对象,也必须指定它以保持签名。否则,该next对象将被解释为常规中间件,并且将无法处理错误。
以与其他中间件函数相同的方式定义错误处理中间件函数,除了四个参数而不是三个,特别是签名(err, req, res, next)):
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status().send('Something broke!')
})
有关错误处理中间件的详细信息,请参阅:错误处理。
内置中间件
从版本4.x开始,Express不再依赖于Connect。之前包含在Express中的中间件功能现在位于单独的模块中; 查看中间件功能列表。
Express具有以下内置中间件功能:
- express.static提供静态资源,如HTML文件,图像等。
- express.json使用JSON有效负载解析传入的请求。注意:适用于Express 4.16.0+
- express.urlencoded用URL编码的有效负载解析传入的请求。 注意:适用于Express 4.16.0+
第三方中间件
使用第三方中间件为Express应用程序添加功能。
安装Node.js模块以获得所需的功能,然后在应用程序级别或路由器级别将其加载到您的应用程序中。
以下示例说明了安装和加载cookie解析中间件功能cookie-parser。
$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser') // 加载cookie解析中间件
app.use(cookieParser())
参考链接:http://www.expressjs.com.cn/en/guide/using-middleware.html
Node.js + Express中间件详解的更多相关文章
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- node.js的npm详解
一.什么是npm呢 npm(Node Package Manager,node包管理器)是node的包管理器,他允许开发人员在node.js应用程序中创建,共享并重用模块.模块就是可以在不同的项目中重 ...
- Node.js HTTP 使用详解
对于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response, ...
- Node.js中Async详解:流程控制
安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 集合 ...
- 阿里云ECS服务器部署Node.js项目全过程详解
本文详细介绍如何部署NodeJS项目到阿里云ECS上,以及本人在部署过程中所遇到的问题.坑点和解决办法,可以说是全网最全最详细的教程了.同时讲解了如何申请阿里云免费SSL证书,以及一台ECS服务器配置 ...
- Node.js之eventproxy详解
安装 npm install eventproxy --save 调用 var EventProxy = require('eventproxy'); 异步协作 多类型异步协作 此处以页面渲染为场景, ...
- body-parser Node.js(Express) HTTP请求体解析中间件
body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日 781 声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...
- modeJS 深了解(1): Node.js + Express 构建网站预备知识
转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...
- Node.js Express 框架学习
转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...
随机推荐
- Linux命令之locate命令
1.locate locate 命令是文件搜索命令,它的搜索速度比 find 命令更快,原因在于它不搜索具体目录, 而是搜索一个数据库,这个数据库包含本地所有文件信息.Linux系统自动创建这个数据库 ...
- iPhone 尺寸 iPhonex
http://tool.lanrentuku.com/guifan/ui.html 这是本人复制的链接,,如有不适用,,请;联系本人删除链接,,谢谢. iPhone x尺寸 1125x2436@3x ...
- 七牛云存储上传自有证书开启https访问
虽然七牛云存储也提供免费SSL证书申请,但我就喜欢用其他平台申请的,于是在腾讯云申请了免费SSL证书,正准备在七牛上传,弹出的界面却让我傻了眼,如下图所示: 腾讯免费SSL证书提供了不同服务器环境的版 ...
- Qt532.数值转为16进制(并填充)
ZC:QString::number(要转换的数值, 需要转换的目标进制); ZC:QString("%1").arg(要转换的数值, 需要填充到?位, 需要转换的目标进制, 用于 ...
- [原][osg]osg文件与osgb文件的区别
osgb是二进制文件 osg是文本文件 osgb可以通过osgconv.exe转换成osg文件 osgb可以包含纹理文件(就是贴图) osg只能连接外部纹理文件(是的,你看到的cow.osg都是用的外 ...
- sass、less是什么,如何使用?
一个很好的介绍的SASS,LESS的区别的文档,值get 1.背景介绍 CSS 是一门非程序式语言,没有变量.函数.SCOPE(作用域),需要书写大量看似没有逻辑的代码,不方便维护及扩 展,不利于复用 ...
- 力扣 (LeetCode)657. 机器人能否返回原点
在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i] 表示其第 i 次移动.机器 ...
- github优秀前端项目分享(转)
http://microjs.com/# 该网站的资源都托管到了github,microjs.com是一个可以让你选择微型的js类库的网站,该网站里的js库都是压缩后不大于5KB的,非常实用 http ...
- php set_time_limit()的作用是什么
php set_time_limit()用法测试 一.总结 一句话总结:在php中set_time_limit函数是用来限制页面执行时间的,如我想把一个php页面的执行时间定义为5秒就可以set_ti ...
- Server SQL Modes
The MySQL server can operate in different SQL modes, and can apply these modes differently for diffe ...