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

 更新时间:2022年10月14日 10:11:19   作者:暴走的比卡丘  
这篇文章主要为大家介绍了nodejs express路由匹配控制及Router模块化使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

路由控制匹配

本文主要分析下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那掌握其路由规则是必不可少的学习。另外最后能去看下其源码的实现。

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

相关文章

  • node koa2 ssr项目搭建的方法步骤

    node koa2 ssr项目搭建的方法步骤

    这篇文章主要介绍了node koa2 ssr项目搭建的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 实战node静态文件服务器的示例代码

    实战node静态文件服务器的示例代码

    本篇文章主要介绍了实战node静态文件服务器的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • node.js中的http.request方法使用说明

    node.js中的http.request方法使用说明

    这篇文章主要介绍了node.js中的http.request方法使用说明,本文介绍了http.request的方法说明、语法、接收参数、使用实例和实现源码需要的朋友可以参考下
    2014-12-12
  • nodejs使用Sequelize框架操作数据库的实现

    nodejs使用Sequelize框架操作数据库的实现

    这篇文章主要介绍了nodejs使用Sequelize框架操作数据库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Node.js学习教程之HTTP/2服务器推送【译】

    Node.js学习教程之HTTP/2服务器推送【译】

    这篇文章主要给大家介绍了关于Node.js学习教程之HTTP/2服务器推送的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 详解Node.js中的Async和Await函数

    详解Node.js中的Async和Await函数

    这篇文章主要介绍了Node.js中的Async和Await函数的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 从零学习node.js之mysql数据库的操作(五)

    从零学习node.js之mysql数据库的操作(五)

    因为接触Node.JS已经有一段时间了,最近粗略的研究了一下node.js操作数据库的包,觉得node.js连接数据库不错。下面这篇文章主要给大家介绍了node.js之mysql数据库操作的相关资料,需要的朋友可以参考下。
    2017-02-02
  • NodeJS和BootStrap分页效果的实现代码

    NodeJS和BootStrap分页效果的实现代码

    这篇文章主要介绍了NodeJS和BootStrap分页效果的实现代码的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • 使用Node实现Git仓库批量克隆的操作步骤

    使用Node实现Git仓库批量克隆的操作步骤

    分享一个node脚本,通过调用gitee的OpenApi获取自己的代码仓库列表,达到批量克隆项目的效果,文中通过代码示例和图文讲解的非常详细,感兴趣的小伙伴可以参考阅读一下
    2024-04-04
  • Node.js中的流(Stream)的作用详解

    Node.js中的流(Stream)的作用详解

    在 Node.js 中,stream模块提供了用于实现流接口的 API,但是很多内置模块都提供了关于流的 API,所以通常不需要显式的调用 stream 模块来使用流,本文给大家介绍一下Node.js中的流(Stream)有什么作用,需要的朋友可以参考下
    2023-08-08

最新评论