当前位置 : 主页 > 网络编程 > JavaScript >

nodejs express路由匹配控制及Router模块化使用详解

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 路由控制匹配 Router模块化路由 使用方式 对比app上的路由 总结 路由控制匹配 本文主要分析下express的核心功能 路由 的使用。 express路由的匹配规则: 支持模糊匹配,同一个路由可
目录
  • 路由控制匹配
  • Router模块化路由
    • 使用方式
    • 对比app上的路由
  • 总结

    路由控制匹配

    本文主要分析下express的核心功能路由的使用。

    express路由的匹配规则:

    • 支持模糊匹配,同一个路由可能命中多个定义的路由
    router.get("/user/*",(req,res,next)=>{
       console.log("====demo====")
    })
    router.get("/user/list",(req,res,next)=>{
       console.log("====demo====")
    })
    

    调用接口/user/list其实回同时匹配到定义的/user/*和/user/list两个路由,但express还有个先后执行的规则所以只会执行前面定义的。

    • 按照定义的先后顺序进行匹配
    • 请求类型请求的PATH同时匹配成功,才会算是成功命中路由调用其对应的处理函数。
    • 字符串匹配是我们常用的路由规则,以/来定义这中规则比较简单此处不在介绍。
    • 字符串模版匹配
    // 该路由匹配了1234和124
    app.get('/12?34', function (req, res,next) {
      res.send('-----字符串模板匹配-----')
    })
    // 该路由匹配了`1234`、`12234`、`122234`等。
    app.get('/12+34', function (req, res,next) {
      res.send('-----字符串模板匹配-----')
    })
    // 通配符*,表示所有字符串,该路由匹配了/12**所有路径
    app.get('/12*', function (req, res,next) {
      res.send('-----字符串模板匹配-----')
    })
    

    占位符的路由,在回调函数中我们可以通过req.params[占位符的key]来取传入占位符位置的值。

    //此路由将匹配到/user/**(任意值)的路由
    app.get('/user/:id', function (req, res,next) {
      res.send('-----占位符-----',req.params.id)
    })
    

    注:占位符定义规则只能是大小写字符数字和下划线[A-Za-z0-9_]

    • 正则匹配:可以写正则表达式来作为路由的匹配规则,正则表达虽然不易读,但是非常适合来定义一些复杂的路由。
    // 表示路由必须有user+数字+小写字母组成
    app.get(/user\/[0-9]\/[a-z]/, function (req, res) {
      res.send('/b/')
    })
    

    注:express的路由匹配规则原理使用Path-to-RegExp来实现,有兴趣可以去看看。

    • 路由控制转移:上面说路由的规则支持模糊匹配,同一个路由可能命中多个定义的路由,但是由于先后顺序规则只会执行第一个,那如果我们也想执行后面定义的路由咋办呢?此时回调函数的第三个参数next就起到了路由控制转移的功能
    router.get("/user/*",(req,res,next)=>{
       console.log("demo1")
       next()
    })
    router.get("/user/list",(req,res,next)=>{
       console.log("demo2")
    })
    

    当请求/user/list时候回打印:demo1 和 demo2

    Router模块化路由

    Router路由是express4.x后加入的api,这个方便了我们项目的解藕,通过模块化路由我们可以将应用中不同的功能封装成一个个的模块。

    使用方式

    • 定义相关的模块demo.js文件
    • 在模块demo.js文件中引入Router,并定义相关路由和回调
    • 模块demo.js文件中导出router对象
    //demo.js
    let express = require('express');
    let router = express.Router();
    router.get("/user",(req,res,next)=>{
       console.log("====demo====")
    })
    module.exports = router
    
    • 入口文件引入模块js文件,并作为中间件注入到app路由上,并加上相应的前缀
    let express = require('express');
    let app = express();
    // 引入demo.js
    let demoRoutes = require('./demo.js');
    app.use('/demo',demoRoutes)
    app.listen(3000);
    

    对比app上的路由

    • 模块化路由Router与app上的路由在功能上没有任何区别,都是处理中间件和路由。
    • 模块化路由Router只能已模块形式存在并不能在没有app路由下单独运行。
    • 简单的应用app就可以直接处理,复杂需要引入Router方便模块化和项目的后期扩展

    总结

    express中路由的处理是整个express的核心功能之一,这个也是express能快速开发项目的基础。要想用好express那掌握其路由规则是必不可少的学习。另外最后能去看下其源码的实现。

    • 参考文档1:Express 文档(路由)
    • 参考文档2:Express 文档
    • 参考文档3Express 实战(五):路由

    以上就是nodejs express路由匹配控制及Router模块化使用详解的详细内容,更多关于nodejs express路由匹配Router的资料请关注易盾网络其它相关文章!

    上一篇:Vue中的事件绑定与解绑方式
    下一篇:没有了
    网友评论