最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Node.js + Express中间件详解

    正文概述 掘金(赖先生)   2020-12-14   498

    关注公众号: 微信搜索 web全栈进阶 ; 收货更多的干货

    使用中间件

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

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

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

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

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

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

    • 应用程序级中间件
    • 路由器级中间件
    • 错误处理中间件
    • 内置中间件
    • 第三方中间件

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

    应用程序级中间件

    通过使用和函数将应用程序级中间件绑定到app对象的实例,其中是中间件函数以小写形式处理的请求的HTTP方法(例如GETPUTPOST)。app.use()、app.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 === '0') 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 === '0') 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(401)
    })

    错误处理中间件

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

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

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

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

    内置中间件

    从版本4.x开始,Express不再依赖于Connect。之前包含在Express中的中间件功能现在位于单独的模块中; 查看中间件功能列表。

    Express具有以下内置中间件功能:

    • express.static提供静态资源,如HTML文件,图像等。
    • express.json使用JSON有效负载解析传入的请求。注意:适用于Express 4.16.0+
    • express.urlencodedURL编码的有效负载解析传入的请求。 注意:适用于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())

    结尾

    文章来源:自己博客文章:https://www.cnblogs.com/ljx20180807/p/9895004.html

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


    起源地下载网 » Node.js + Express中间件详解

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元