• Express 7 指南 - 开发中间件


    Express

    Express 中文网

    本文仅用于学习记录,不存在任何商业用途,如侵删

    7 指南 - 开发中间件

    编写用于 Express 应用程序的中间件

    7.1 概述

    中间件函数是可以访问请求对象 ( req)、响应对象( res) 和next应用程序请求-响应周期中的函数的函数。

    next函数是 Express 路由器中的一个函数,当被调用时,它会在当前中间件之后执行中间件。

    中间件函数可以执行以下任务:

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

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

    下图显示了中间件函数调用的元素:

    在这里插入图片描述

    从 Express 5 开始,返回 Promise 的中间件函数将next(value)在它们拒绝或抛出错误时调用。【嗯,现在还是4】

    next将使用被拒绝的值或抛出的错误调用。

    7.2 例子

    一个简单的“Hello World”Express 应用程序示例。

    在这里插入图片描述

    运行测试下:

    在这里插入图片描述

    没问题。

    接下来,将定义并向应用程序添加三个中间件函数:一个调用myLogger打印简单的日志消息,一个调用requestTime显示 HTTP 请求的时间戳,另一个调用validateCookies验证传入的 cookie。

    7.2.1 中间件函数 myLogger

    这是一个名为“myLogger”的中间件函数的简单示例。当对应用程序的请求通过它时,此函数只会打印“LOGGED”。中间件函数被分配给一个名为 的变量myLogger

    var myLogger = function (req, res, next) {
      console.log('LOGGED')
      next()
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    注意上面对 的调用next()。调用此函数会调用应用程序中的下一个中间件函数。该next()函数不是 Node.js 或 Express API 的一部分,而是传递给中间件函数的第三个参数。该next()函数可以命名为任何名称,但按照惯例,它始终命名为“next”。为避免混淆,请始终使用此约定。

    要加载中间件函数,调用app.use(),指定中间件函数。

    例如,以下代码myLogger在路由到根路径 (/) 之前加载中间件函数。

    在这里插入图片描述

    重新运行,测试

    在这里插入图片描述

    从结果中可以看到,每次应用程序收到请求时,它都会将消息“LOGGED”打印到终端。

    中间件加载的顺序很重要:首先加载的中间件函数也会先执行。

    如果myLogger在路由到根路径之后加载,则请求永远不会到达它并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序终止了请求-响应循环。

    中间件函数myLogger只是打印一条消息,然后通过调用该函数将请求传递给堆栈中的下一个中间件next()函数。

    7.2.2 中间件函数 requestTime

    接下来,我们将创建一个名为“requestTime”的中间件函数,并为请求对象添加一个名为requestTime` 的属性。

    var requestTime = function (req, res, next) {
      req.requestTime = Date.now()
      next()
    }
    
    • 1
    • 2
    • 3
    • 4
    var express = require('express')
    var app = express()
    
    // var myLogger = function (req, res, next) {
    //     console.log('LOGGED')
    //     next()
    // }
    
    var requestTime = function (req, res, next) {
        req.requestTime = Date.now()
        next()
    }
    
    app.use(requestTime)
    
    app.get('/', function (req, res) {
        var responseText = 'Hello World!
    ' responseText += 'Requested at: ' + req.requestTime + '' res.send(responseText) }) app.listen(3000)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    重启服务,测试

    在这里插入图片描述

    当您向应用程序的根发出请求时,应用程序现在会在浏览器中显示您的请求的时间戳。

    7.2.3 中间件函数 validateCookies

    最后,我们将创建一个中间件函数来验证传入的 cookie 并在 cookie 无效时发送 400 响应。

    这是一个使用外部异步服务验证 cookie 的示例函数。

    async function cookieValidator (cookies) {
      try {
        await externallyValidateCookie(cookies.testCookie)
      } catch {
        throw new Error('Invalid cookies')
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    在这里,我们使用cookie-parser中间件

    在这里插入图片描述

    从对象中解析传入的 cookiereq并将它们传递给我们的cookieValidator函数。中间件返回一个 Promise ,validateCookies在拒绝时会自动触发我们的错误处理程序。

    var express = require('express')
    var cookieParser = require('cookie-parser')
    var cookieValidator = require('./cookieValidator')
    
    var app = express()
    
    async function validateCookies (req, res, next) {
      await cookieValidator(req.cookies)
      next()
    }
    
    app.use(cookieParser())
    
    app.use(validateCookies)
    
    // error handler
    app.use(function (err, req, res, next) {
      res.status(400).send(err.message)
    })
    
    app.listen(3000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    运行服务, 测试

    在这里插入图片描述

    请注意如何next()调用 after await cookieValidator(req.cookies)。这确保了如果cookieValidator解决,堆栈中的下一个中间件将被调用。如果您向next()函数传递任何内容(字符串'route'或除外'router'),Express 会将当前请求视为错误,并将跳过任何剩余的非错误处理路由和中间件函数。

    因为您可以访问请求对象、响应对象、堆栈中的下一个中间件函数以及整个 Node.js API,所以中间件函数的可能性是无穷无尽的。

    有关 Express 中间件的更多信息,请参阅:使用 Express 中间件

    在这里插入图片描述

    7.3 可配置的中间件

    如果您需要可配置中间件,请导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。

    文件:my-middleware.js

    module.exports = function (options) {
      return function (req, res, next) {
        // Implement the middleware function based on the options object
        next()
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    现在可以使用中间件,如下所示。

    var mw = require('./my-middleware.js')
    
    app.use(mw({ option1: '1', option2: '2' }))
    
    • 1
    • 2
    • 3

    Refer to cookie-session and compression for examples of configurable middleware.

    有关可配置中间件的示例,请参阅cookie-session压缩

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    如何访问TDH中Inceptor 底层的元数据库TxSQL
    制作web3d动态产品展示的优点
    C语言:空指针野指针
    SpringBoot进制转换规则问题
    《七月集训》(第二十天)——二叉搜索树
    【Shell篇一】操作系统、内核、Shell、Shell脚本
    基于MQTT和nodeMCU的音乐弹奏APP设计
    NLP相关概念汇总
    PHP基于thinkphp的网上图书管理系统#毕业设计
    力扣刷题之二叉树专栏
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128111088