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

作者:暴走的比卡丘 时间:2024-05-11 10:17:18 

路由控制匹配

本文主要分析下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方便模块化和项目的后期扩展

  • 参考文档1:Express 文档(路由)

  • 参考文档2:Express 文档

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

来源:https://juejin.cn/post/7154012895242616840

标签:nodejs,express,路由匹配,Router
0
投稿

猜你喜欢

  • MySQL分区的功能和限制讲解

    2010-10-14 14:03:00
  • 如何把数组转换成字符串?

    2009-11-06 13:49:00
  • golang常用库之gorilla/mux-http路由库使用详解

    2024-04-29 13:04:01
  • 解析MySQL创建外键关联错误 - errno:150

    2024-01-16 03:41:14
  • js实现一个简易的计算器

    2024-02-23 11:48:31
  • 如何从ASP连接到Oracle Server?

    2009-11-15 19:52:00
  • JS实现TITLE悬停长久显示效果完整示例

    2024-04-16 09:54:00
  • 第二篇Bootstrap起步

    2024-04-16 08:59:36
  • 一个简单的ASP计数器代码

    2010-04-24 15:49:00
  • python使用pyaudio录音和格式转化方式

    2023-11-07 19:30:03
  • Python中的 pass 占位语句

    2023-02-21 20:45:12
  • python实现RSA加密(解密)算法

    2023-04-20 06:12:15
  • vue.extend与vue.component的区别和联系

    2024-05-29 22:45:47
  • python网络爬虫selenium打开多窗口与切换页面的实现

    2023-10-30 23:50:31
  • Python 定义只读属性的实现方式

    2023-04-28 01:11:22
  • 日期垂直排列的两种技巧

    2009-08-28 12:38:00
  • Python 爬虫的原理

    2023-01-18 21:05:35
  • 两大步骤教您开启MySQL 数据库远程登陆帐号的方法

    2024-01-16 10:01:35
  • Sql Server 查询性能优化之走出索引的误区分析

    2012-05-22 18:56:52
  • 使用Spring Boot实现操作数据库的接口的过程

    2024-01-25 02:02:49
  • asp之家 网络编程 m.aspxhome.com