使用中间件

Express是一种路由和中间件Web框架,它具有自己的最小功能:Express应用程序本质上是一系列中间件函数调用。

中间件函数是可以访问请求对象 (req),响应对象res)以及应用程序的请求 - 响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为的变量表示next

中间件功能可以执行以下任务:

  1. 执行任何代码。
  2. 更改请求和响应对象。
  3. 结束请求 - 响应周期。
  4. 调用堆栈中的下一个中间件函数。

如果当前的中间件函数没有结束请求 - 响应周期,则必须调用next()以将控制传递给下一个中间件函数。否则,请求将被挂起。

Express应用程序可以使用以下类型的中间件:

您可以使用可选的装载路径加载应用程序级和路由器级中间件。您还可以将一系列中间件功能加载在一起,从而在安装点创建中间件系统的子堆栈。

应用程序级中间件

通过使用和函数将应用程序级中间件绑定到app对象的实例,其中是中间件函数以小写形式处理的请求的HTTP方法(例如GET,PUT或POST)。app.use()app.METHOD()METHOD

此示例显示了没有装载路径的中间件功能。每次应用程序收到请求时都会执行该功能。

  1. var app = express()
  2. app.use(function (req, res, next) {
  3. console.log('Time:', Date.now())
  4. next()
  5. })

此示例显示了/user/:id路径上安装的中间件功能。对/user/:id路径上的任何类型的HTTP请求执行该函数。

  1. app.use('/user/:id', function (req, res, next) {
  2. console.log('Request Type:', req.method)
  3. next()
  4. })

此示例显示了路由及其处理函数(中间件系统)。该函数处理对/user/:id路径的GET请求。

  1. app.get('/user/:id', function (req, res, next) {
  2. res.send('USER')
  3. })

下面是一个使用挂载路径在挂载点加载一系列中间件函数的示例。它说明了一个中间件子堆栈,它将任何类型的HTTP请求的请求信息打印到/user/:id路径。

  1. app.use('/user/:id', function (req, res, next) {
  2. console.log('Request URL:', req.originalUrl)
  3. next()
  4. }, function (req, res, next) {
  5. console.log('Request Type:', req.method)
  6. next()
  7. })

路径处理程序使您可以为路径定义多个路径。下面的示例为/user/:id路径的GET请求定义了两个路由。第二个路由不会引起任何问题,但它永远不会被调用,因为第一个路由结束了请求 - 响应周期。

此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。

  1. app.get('/user/:id', function (req, res, next) {
  2. console.log('ID:', req.params.id)
  3. next()
  4. }, function (req, res, next) {
  5. res.send('User Info')
  6. })
  7.  
  8. // user/:id路径的处理程序,用于打印用户标识
  9. app.get('/user/:id', function (req, res, next) {
  10. res.end(req.params.id)
  11. })

要从路由器中间件堆栈中跳过其余的中间件功能,请调用next('route')将控制权传递给下一个路由。 注意next('route')仅适用于使用app.METHOD()router.METHOD()函数加载的中间件函数。

此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。

  1. app.get('/user/:id', function (req, res, next) {
  2. // 如果用户ID为0,则跳到下一个路由
  3. if (req.params.id === '') next('route')
  4. // 否则将控件传递给此堆栈中的下一个中间件函数
  5. else next()
  6. }, function (req, res, next) {
  7. // 返回数据信息
  8. res.send('regular')
  9. })
  10.  
  11. // user/:id路径的处理程序,它发送一个特殊的响应
  12. app.get('/user/:id', function (req, res, next) {
  13. res.send('special')
  14. })

路由器级中间件

路由器级中间件的工作方式与应用程序级中间件的工作方式相同,但它绑定到的是一个实例express.Router()

  1. var router = express.Router()

使用router.use()router.METHOD()函数加载路由器级中间件。

以下示例代码通过使用路由器级中间件复制上面显示的应用程序级中间件的中间件系统:

  1. var app = express()
  2. var router = express.Router()
  3.  
  4. // 没有挂载路径的中间件功能。 对于路由器的每个请求都执行此代码
  5. router.use(function (req, res, next) {
  6. console.log('Time:', Date.now())
  7. next()
  8. })
  9.  
  10. // 对/ user/:id路径的任何类型的HTTP请求的都会执行
  11. router.use('/user/:id', function (req, res, next) {
  12. console.log('Request URL:', req.originalUrl)
  13. next()
  14. }, function (req, res, next) {
  15. console.log('Request Type:', req.method)
  16. next()
  17. })
  18.  
  19. // 用于处理对/ user /:id路径的GET请求
  20. router.get('/user/:id', function (req, res, next) {
  21. // 如果用户ID为0,则跳到下一个路由器
  22. if (req.params.id === '') next('route')
  23. // 否则将执行下一个中间件函数
  24. else next()
  25. }, function (req, res, next) {
  26. // 渲染regular页面
  27. res.render('regular')
  28. })
  29.  
  30. // / user /:id路径的处理程序,它会渲染页面
  31. router.get('/user/:id', function (req, res, next) {
  32. console.log(req.params.id)
  33. res.render('special')
  34. })
  35.  
  36. // 初始化引入router中间件
  37. app.use('/', router)

要跳过路由器中间件的其余功能,请调用next('router') 将控制权交还给路由器实例。

此示例显示了一个中间件子堆栈,用于处理对/user/:id路径的GET请求。

  1. var app = express()
  2. var router = express.Router()
  3.  
  4. // 在需要时对路由器的检查
  5. router.use(function (req, res, next) {
  6. if (!req.headers['x-auth']) return next('router')
  7. next()
  8. })
  9.  
  10. router.get('/', function (req, res) {
  11. res.send('hello, user!')
  12. })
  13.  
  14. // 使用路由器和设置请求结果状态码
  15. app.use('/admin', router, function (req, res) {
  16. res.sendStatus()
  17. })

错误处理中间件

错误处理中间件总是需要四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使您不需要使用该next对象,也必须指定它以保持签名。否则,该next对象将被解释为常规中间件,并且将无法处理错误。

以与其他中间件函数相同的方式定义错误处理中间件函数,除了四个参数而不是三个,特别是签名(err, req, res, next)):

  1. app.use(function (err, req, res, next) {
  2. console.error(err.stack)
  3. res.status().send('Something broke!')
  4. })

有关错误处理中间件的详细信息,请参阅:错误处理

内置中间件

从版本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

  1. $ npm install cookie-parser
  2. var express = require('express')
  3. var app = express()
  4. var cookieParser = require('cookie-parser')
  5.  
  6. // 加载cookie解析中间件
  7. app.use(cookieParser())

参考链接:http://www.expressjs.com.cn/en/guide/using-middleware.html

Node.js + Express中间件详解的更多相关文章

  1. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  2. node.js的npm详解

    一.什么是npm呢 npm(Node Package Manager,node包管理器)是node的包管理器,他允许开发人员在node.js应用程序中创建,共享并重用模块.模块就是可以在不同的项目中重 ...

  3. Node.js HTTP 使用详解

    对于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response, ...

  4. Node.js中Async详解:流程控制

    安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 集合 ...

  5. 阿里云ECS服务器部署Node.js项目全过程详解

    本文详细介绍如何部署NodeJS项目到阿里云ECS上,以及本人在部署过程中所遇到的问题.坑点和解决办法,可以说是全网最全最详细的教程了.同时讲解了如何申请阿里云免费SSL证书,以及一台ECS服务器配置 ...

  6. Node.js之eventproxy详解

    安装 npm install eventproxy --save 调用 var EventProxy = require('eventproxy'); 异步协作 多类型异步协作 此处以页面渲染为场景, ...

  7. body-parser Node.js(Express) HTTP请求体解析中间件

    body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...

  8. modeJS 深了解(1): Node.js + Express 构建网站预备知识

    转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...

  9. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

随机推荐

  1. js数组常用方法,含es5

    (1)基本的数组方法 1.join() Array.join()方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串.可以自己指定分隔的符号,如果不指定,默认使用逗号 var arr ...

  2. 【译】第13节---数据注解-Required

    原文:http://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-firs ...

  3. WebPack基本概念以及基本使用

    入门Webpack,看这篇就够了 2017年9月18日更新,添加了一个使用webpack配置多页应用的demo,可以点击此处查看 2017年8月13日更新,本文依据webpack3.5.3将文章涉及代 ...

  4. 分布式系统的唯一id生成算法你了解吗?

    在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ...

  5. cookie被禁用,如何使用session

    转载自:https://blog.csdn.net/ai_shuyingzhixia/article/details/80778183 1.禁止使用cookie response.encodeURL( ...

  6. Android 用虹软SDK做人脸识别

    人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...

  7. 牛客OI周赛6-提高组 A 大法师与魔法石

    大法师与魔法石 思路: 对于一个ai, 它可以构成区间[ai/v, ai] 假设和它相邻的为aj, 那么ai 和 aj 构成的区间为[(ai+aj) / v, ai+aj] 那么这两个区间能合并的条件 ...

  8. 第 6 章 存储 - 039 - Data Volume 之 bind mount

    Data Volume Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中. Data Volume 有以下特点: 1.Dat ...

  9. Mongodb脚本记录

    mongoexport -h -d stat_terminalbase -c stat_terminalbase -f terminal_mac,detect_time,site_id,device_ ...

  10. seo中的竞价排名是什么

    seo中的竞价排名是什么 一.总结 一句话总结:竞价排名的基本特点是按点击付费,推广信息出现在搜索结果中(一般是靠前的位置),如果没有被用户点击,则不收取推广费. 搜索引擎的一种推广广告的方式 1.竞 ...