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


猜你喜欢
- 以下的文章主要向大家介绍的是实现MySQL远程访问的实际操作流程,以及在实现MySQL远程访问的过程中哪些的相关事项是十分重要的,以下就是文
- 用python连接Oracle是总是乱码,最有可能的是oracle客户端的字符编码设置不对。本人是在进行数据插入的时候总是报关键字"
- 导言结束前面的几节,我们已经探讨过了如何使用GridView、DetailsView和FormView控件来显示数据。这些控件简单地操作提供
- 先贴代码,之后完善:<!doctype html><html lang="en"> <he
- 本文实例为大家分享了python文件写入write()的操作的具体代码,供大家参考,具体内容如下filename = 'pragra
- 一、错误代码:摘要和详细的url获取不到import asynciofrom bs4 import BeautifulSoupimport
- 本文实例讲述了Python使用xlrd模块操作Excel数据导入的方法。分享给大家供大家参考。具体分析如下:xlrd是一个基于python的
- 什么是计算属性概念计算属性是vue里面为了简化在模板语法中对响应式属性做计算而存在的什么时候应该使用计算属性根据现有响应式的值得到一个新的值
- split()介绍函数:split()Python中有split()和os.path.split()两个函数,具体作用如下:split():
- 思想:4个数字的排列,加上3个运算符的排列,使用后缀表达式的表现如下:情形一:1,2,3,4,+,-,* => 24*24*4情形二:
- 判断字段是否存在:DROP PROCEDURE IF EXISTS schema_change; DELIMITER //CREATE PR
- 使用open-cv实现简单的手势识别。刚刚接触python不久,看到了很多有意思的项目,尤其时关于计算机视觉的。网上搜到了一些关于手势处理的
- 一、Vue3 与 Vue2 区别详述1. 生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上 + “
- 作为入门者来说,了解JavaScript中timer的工作方式是很重要的。通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线
- 关于Mysql的触发器,基本上每个Mysql教程里都有讲到,但是我发现那些教程里讲的都是如何处理其他表的数据。在Mysql中写触发器操作本表
- 数据结构channel的数据结构在$GOROOT/src/runtime/chan.go文件下:type hchan struct {qco
- 如下所示: matplotlib.pyplot.hist( x, bins=10, range=None, normed=Fa
- 在实际应用过程中,只要保证选项卡模块结构代码的完整性,就可以任意添加N个同类选项卡,不需要手动在HTML里绑定事件处理程序以及给要隐藏显示的
- 目录1、原始需求2、解决方案3、canal介绍、安装canal的工作原理架构安装4、验证1、原始需求既要同步原始全量数据,也要实时同步MyS
- 最近突然发现我们部署在数据库上面的告警(Alert),当错误日志里面出现错误时,并不是每个错误日志都会发送邮件出来。如下所示,设置了告警“S