美文网首页
express初步学习-中间件

express初步学习-中间件

作者: 文仔CXKSNLXX | 来源:发表于2018-09-24 20:25 被阅读0次

    express学习——中间件

    Express是什么?

    Express是一个基于Node.js平台的web应用开发框架,在Node.js基础之上扩展了web应用开发所需要的基础功能,从而使得我们开发Web应用更加方便、更加快捷。其中,Express项目的底层由许多的中间件在协同工作,可以这么说,一个 Express 应用就是在调用各种中间件。

    什么是中间件

    中间件是一个可访问请求对象(req)和响应对象(res)的函数,在 Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示。中间件的功能包括:

    1. 执行任何代码。
    2. 修改请求和响应对象。
    3. 终结请求-响应循环。
    4. 调用堆栈中的下一个中间件。
      注意: 如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。

    中间件的类别

    应用级中间件

    应用级别的中间件绑定到express实例,用法是 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请求定义了两个路由。第二个路由不会引起任何问题,但它永远不会被调用,因为第一个路由结束了请求 - 响应周期。
    app.get('/user/:id', function (req, res, next) {
      console.log('ID:', req.params.id)
      next()
    }, function (req, res, next) {
      res.send('User Info')
    })
    
    // handler for the /user/:id path, which prints the user ID
    app.get('/user/:id', function (req, res, next) {
      res.end(req.params.id)
    })
    

    如果需要在中间件栈中跳过剩余中间件,调用 next(‘route’) 方法将控制权交给下一个路由。需要 注意的是:next('route')仅适用于使用app.METHOD()或router.METHOD()函数加载的中间件函数。

    app.get('/user/:id', function (req, res, next) {
      // if the user ID is 0, skip to the next route
      if (req.params.id === '0') next('route')
      // otherwise pass the control to the next middleware function in this stack
      else next()
    }, function (req, res, next) {
      // send a regular response
      res.send('regular')
    })
    
    // handler for the /user/:id path, which sends a special response
    app.get('/user/:id', function (req, res, next) {
      res.send('special')
    })
    

    路由器级别中间件

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

    var router = express.Router()enter code here
    

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

    var app = express()
    var router = express.Router()
    
    // a middleware function with no mount path. This code is executed for every request to the router
    router.use(function (req, res, next) {
      console.log('Time:', Date.now())
      next()
    })
    
    // a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
    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()
    })
    
    // a middleware sub-stack that handles GET requests to the /user/:id path
    router.get('/user/:id', function (req, res, next) {
      // if the user ID is 0, skip to the next router
      if (req.params.id === '0') next('route')
      // otherwise pass control to the next middleware function in this stack
      else next()
    }, function (req, res, next) {
      // render a regular page
      res.render('regular')
    })
    
    // handler for the /user/:id path, which renders a special page
    router.get('/user/:id', function (req, res, next) {
      console.log(req.params.id)
      res.render('special')
    })
    
    // mount the router on the app
    app.use('/', router)
    

    调用next(“router”)跳过路由器中间件的其余功能,将控制权还给路由器实例
    例子:

    var app = express()
    var router = express.Router()
    
    // predicate the router with a check and bail out when needed
    router.use(function (req, res, next) {
      if (!req.headers['x-auth']) return next('router')
      next()
    })
    
    router.get('/', function (req, res) {
      res.send('hello, user!')
    })
    
    // use the router and 401 anything falling through
    app.use('/admin', router, function (req, res) {
      res.sendStatus(401)
    })
    

    错误处理中间件

    四个参数:(err, req, res, next)
    例子:

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

    注意:即使你用不到next,也必须有这个签名。

    内置中间件

    1. express.static提供静态资源,如HTML文件,图像等。
    2. express.json使用JSON有效负载解析传入的请求。注意:适用于Express 4.16.0+
    3. express.urlencoded用URL编码的有效负载解析传入的请求。 注意:适用于Express 4.16.0+

    第三方中间件

    使用前需要先安装相应模块,然后再中间件中加载
    例子:这里用cookie解释中间件作为例子
    安装模块

    $ npm install cookie-parser
    

    引用

    var express = require('express')
    var app = express()
    var cookieParser = require('cookie-parser')
    
    // load the cookie-parsing middleware
    app.use(cookieParser())
    

    相关文章

      网友评论

          本文标题:express初步学习-中间件

          本文链接:https://www.haomeiwen.com/subject/uqyhoftx.html