Node.js - 关于 express 路由

143 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

什么是路由

广义上讲,路由就是映射关系(对应关系)


Express 中的路由

  • 在 Express 中,路由指的是客户端的请求与服务器处理函数之前的映射关系

  • Express 中的路由分为 3 部分组成,分别是 请求类型、请求的 URL 地址,处理函数,格式如下

    // METHOD: 请求类型
    // PATH: 请求的 URL 地址
    // HANDLER: 处理函数
    
    app.METHOD(PATH, HANDLER)
    
  • 示例

    匹配 GET 请求,且请求 URL 为 /

    const express = require('express')
    const app = express()
    app.get('/', (req, res) => {
        res.send('请求成功')
    })
    

    匹配 POST 请求,且请求 URL 为 /

    const express = require('express')
    const app = express()
    app.post('/', (req, res) => {
        res.send('请求成功')
    })
    

路由的匹配过程

  • 每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数

  • 在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理

    Snip20220401_4.png

  • 路由匹配的注意点:

    • 按照定义的先后顺序进行匹配
    • 请求类型请求的URL 同时匹配成功,才会调用对应的处理函数

路由的使用

在 Express 中使用路由最简单的方式,就是把路由挂载到 app 上

const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.send('请求成功')
})

app.post('/', (req, res) => {
    res.send('请求成功')
})

app.listen(80, () => {
    console.log('express 服务器运行在 http://127.0.0.1.80')
})

路由的模块化

  • 实际开发中,如果有 100 个接口,全部挂载到 app 上,这个文件会非常的庞大。为了方便对路由进行模块化的管理, Express 不建议将路由直接挂载到 app 上,而是推荐奖路由抽离为单独的模块
  • 将路由抽离为单独模块的步骤
    • 创建路由模块对应的 js 文件

    • 调用 express.Router() 函数创建路由对象

    • 向路由对象上挂载具体的路由

    • 使用 module.exports 向外共享路由对象

    • 使用 app.use() 函数注册路由模块

  • 示例
    • 创建路由模块

      // 导入 express
      const express = require('express')
      // 创建路由对象
      const router = express.Router()
      
      // 挂载获取用户列表的路由
      router.get('/user/list', function(req,res){
          res.send('用户列表')
      })
      
      // 挂载添加用户的路由
      router.post('/user/add', function(req,res){
          res.send('创建用户')
      })
      
      // 向外导出路由对象
      module.exports = router
      
    • 注册路由模块

      const express = require('express')
      const app = express()
      
      // 导入路由模块
      const router = require('./user')
      
      // 注册路由模块
      app.use(router)
      
      app.listen(80, ()=> {
          console.log('express 服务器运行在 http://127.0.0.1.80')
      })
      
    • 请求地址

      GET 请求
      http://127.0.0.1/user/list
      
      POST 请求
      http://127.0.0.1/user/add
      

为路由模块添加前缀

  • 类似于托管静态资源时,为静态资源统一挂载访问前缀一样,格式如下

    // 导入路由模块
    const router = require('./user')
    
    // 使用 app.use() 注册路由模块,并添加统一的访问前缀 /api
    app.use('/api',router)
    

    添加 /api 前缀后,那么访问 router 模块下的每一个路由都需要以 /api 开头

  • 示例

    请求地址

    GET 请求
    http://127.0.0.1/api/user/list
    
    POST 请求
    http://127.0.0.1/api/user/add