express — app 和 router

https://www.runoob.com/w3cnote/express-4-x-api.html 

常用的两类对象

  • app对象:
    var express = require('express')
    var app = express()

     

  • router对象:
    var express = require('express')
    var router = express.Router()

     

  注意:一个应用程序中只能有一个app,而 router对象可以创建多个

app对象的API

express()用来创建一个Express的程序。每个Express程序(即app)有一个内建的app路由。所以app也可以实现路由

  • app.use([path,], function [, function...]):https://www.runoob.com/w3cnote/express-4-x-api.html
    • 挂载中间件方法到路径上。如果路径未指定,那么默认为"/"。路由自身也是一个中间件,所以路由也可以作为中间件 放在 app.use 里面。
    • 中间件方法是顺序处理的,所以中间件包含的顺序是很重要的。
    • 路径可以是代表路径的一串字符,一个路径模式,一个匹配路径的正则表达式,或者他们的一组集合(即可以是一个数组)。数组类path,如下:
      app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
        next();
      })
    • 中间件方法可以是一个中间件方法,一系列中间件方法,一组中间件方法或者他们的集合(即,可以是一个数组)。
      在逻辑上使用一个数组 来 组织一组中间件,以数组作为 app.use 中间件参数:
      var r1 = express.Router();
      r1.get('/', function (req, res, next) {
        next();
      })
      
      var r2 = express.Router();
      r2.get('/', function (req, res, next) {
        next();
      })
      
      app.use('/', [r1, r2]);
  • app.get:可以理解为特殊的app.use
  • app.post:可以理解为特殊的app.use

 

router对象的API

一个router对象是一个单独的实例关于中间件和路由。你可以认为其是一个"mini-application"(迷你程序),其具有操作中间件和路由方法的能力。每个Express程序(即app)有一个内建的app路由。路由自身表现为一个中间件,所以你可以使用它作为app.use()方法的一个参数或者作为另一个路由的use()的参数。 顶层的express对象有一个Router()方法,你可以使用Router()来创建一个新的router对象。

  • router.use([path], [function, ...] function):
    给可选的path参数指定的路径挂载给定的中间件方法,未指定path参数,默认值为/。 这个方法类似于app.use()
  • router.get:可以理解为特殊的router.use
  • app.post:可以理解为特殊的router.use

 

 

app.use 和 router.use 有什么区别

  • app.use:应用程序级别中间件
  • router.user:路由器级别中间件
  • app.use 和 router.use区别:   为什么有app.use了,还要router.use?
    因为 app.use 中的路径都是从从头开始,一个完整的路径。而且app.use都写在一个模块里,查看比较麻烦,也不好维护。
    如下所示,app.use 创建的路由:
    app.get('/todos', (req, res) => {
        res.send('df')
    })
    app.get('/todos/:id', (req, res) => {
        res.send('df')
    })
    app.post('/todos', (req, res) => {
        res.send('df')
    })
    app.post('/todos/:id', (req, res) => {
        res.send('df')
    })
    app.delete('/todos/:id', (req, res) => {
        res.send('df')
    })

    上面的 path 都是在 todos下,用 app.use 无法做到 类似子路由的结构。而router.use可以实现,因为router自身就是一个中间件,可以作为自己的router.use的中间件。如下改造:

    // main.js
    const router = require("./routes/index")
    
    app.use('/todos', router)  // router作为 app.use 的中间件,router里面的路由 会自动添加上这里的 path /todos
    //    router/index.js
    const router = express.Router()
    
    router.get('/', (req, res) => {
        res.send('df')
    })
    router.get('/:id', (req, res) => {
        res.send('df')
    })
    router.post('/', (req, res) => {
        res.send('df')
    })
    router.post('/:id', (req, res) => {
        res.send('df')
    })
    router.delete('/:id', (req, res) => {
        res.send('df')
    })

     

 

posted @ 2018-10-12 14:45  吴飞ff  阅读(521)  评论(0编辑  收藏  举报