web学习笔记(五十)

目录

1. nodemon

1.1 什么是nodemon

1.2 安装并使用Nodemon

2.  Express 路由

2.1 路由的匹配过程

2.2  简单路由

2.3 模块化路由

2.4 注册路由模块

2.5 路由模块添加前缀

3. Express 中间件

3.1 中间件的格式

3.2 中间件的作用

3.3 局部生效的中间件

3.4 中间件的分类

3.4.1 应用级别的中间件

3.4.2 路由级别的中间件

3.4.3 错误级别的中间件

3.4.4 Express内置的中间件

3.4.5 第三方的中间件

3.5  中间件总结


1. nodemon

1.1 什么是nodemon

  nodemon 是一个用于 Node.js 开发的工具,它能够监视你的文件变化并自动重启 Node 应用程序。在开发过程中,当你对代码进行修改并保存时,nodemon 可以帮助你自动重新启动应用程序,这样你无需手动停止和重新启动服务器来查看你的更改。之前每次我们修改过后端代码后都需要ctrl+c结束服务器的运行,然后再用Node命令重新运行代码,比较麻烦,但是现在我们可以通过nodemon 来自动重启Node。

1.2 安装并使用Nodemon

(1)下载nodemon的命令:

npm i -g nodemon

如果下载时出现:无法加载文件........在此系统上禁 止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 abo ut_Execution_Policies这个报错的话请在终端输入下面的这条命令,然后点击回车再输入RemoteSigned再点击回车然后重新执行下载nodemon的命令就可以啦。

Set-ExecutionPolicy -Scope CurrentUser

(2)使用nodemon

之前我们在终端输入命令时都是运行类似于node ./app.js的命令行,现在只需要将node替换为nodemon就可以在nodemon环境下运行项目了。 

2.  Express 路由

路由其实就是映射关系。在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。 

2.1 路由的匹配过程

每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数。在匹配时,会按照定义的先后顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理。

2.2  简单路由

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

let express = require('express');// 2.创建服务器
let app = express();
app.use(express.urlencoded({ extended: false }));
app.use(express.static('public'));// 接口  路由
// 简单路由app.post('/login', (req, res) => {console.log(req.body);res.send({ code: 1,msg:'登录成功',data:req.body})})
// 3.启动服务
app.listen('8080', () => {console.log('启动服务 http://127.0.0.1:8080');
})

2.3 模块化路由

为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块。将路由抽离为单独模块的步骤如下:

  • 创建路由模块对应的 .js 文件  我们可以先创建一个router文件夹,然后在文件夹内创建相应的.js文件。

  • 调用 express.Router() 函数创建路由对象
  • 向路由对象上挂载具体的路由
  • 使用 module.exports 向外共享路由对象
  • 使用 app.use() 函数注册路由模块
// 1.导入experss模块
let express = require('express');
// 2.挂载Router()方法
let router = express.Router() //创建路由对象// 3.开发时将接口挂载在router上
router.get('/user/list', (req, res) => {console.log(req.query);res.send({code: 0,msg: '获取列表成功',});});
router.post('/user/add', (req, res) => {console.log(req.body);res.send({code: 0,msg: '添加成功'})
})
// 把路由管理器对象向外共享/暴露出去
module.exports = router;

2.4 注册路由模块

注册路由首先需要将路由模块通过require关键字进行导入操作,然后再进行注册操作。

// 导入路由模块
let userRouter = require('./router/user');
// 注册路由 有点像中间件
app.use(userRouter);

2.5 路由模块添加前缀

在注册路由时我们可以选择是否为路由模块添加前缀,这个有点像托管静态资源时,给静态资源文件夹加访问前缀

// 可以为路由模块添加前缀
app.use('/api',userRouter);

3. Express 中间件

中间件就是中间的一些处理流程。我们可以通过中间件来对请求做预处理,在中间件中有一个非常重要的next()方法。将中间件都执行完毕后才会执行路由处理函数。

3.1 中间件的格式

一定要注意在中间件函数的形参中一定要有next参数。next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。

app.use((req, res, next) => {// 放一些中间件的处理逻辑console.log('我是中间件的处理环节1');req.cc = 100;next();
});

或者写为:

const mv = (req, res, next) => {// 放一些中间件的处理逻辑console.log('我是中间件的处理环节3');next();
};
//全局生效的中间件
app.use(mv);

 

 

3.2 中间件的作用

       因为多个中间件之间,共享同一份 req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。

app.use((req, res, next) => {// 放一些中间件的处理逻辑console.log('我是中间件的处理环节1');req.cc = 100;next();
});
app.use((req, res, next) => {// 放一些中间件的处理逻辑console.log('我是中间件的处理环节2');next();
});
// 7.中间件再体验
const mv = (req, res, next) => {// 放一些中间件的处理逻辑console.log('我是中间件的处理环节3');console.log(req.cc);//可以输出req.cc=100next();
};
app.use(mv);

3.3 局部生效的中间件

局部中间件和整体中间件在定义时没有太大的差别,局部中间件不需要通过app.use来定义,只需要将中间件的名字写到对应的接口参数位置,这个中间件就会自动转换为局部中间件。 局部中间件也可以定义多个,只需要将中间件的名字以逗号隔开写在对应接口位置即可。

let express = require('express');
// // 创建路由对象
// let router=require('Router')
// 2.创建服务
let app = express();
// 内置中间件
app.use(express.urlencoded({extended: false
}));
app.use(express.static('public'));
const mvjb = (req, res, next) => {// 放一些中间件的处理逻辑console.log('局部3');console.log(req.cc);next();
};
app.post('/add',mvjb, (req, res) => {// req.body;console.log(req.cc);console.log(req.body);res.send({ code: 1,msg:'注册成功',data:req.body})
});
app.listen('8080', () => {console.log('启动服务 http://127.0.0.1:8080');
})

3.4 中间件的分类

3.4.1 应用级别的中间件

通过 app.use() 或 app.get() 或 app.post() ,绑定到 app 实例上的中间件,叫做应用级别的中间件

3.4.2 路由级别的中间件

绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别。只不过,应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上。

3.4.3 错误级别的中间件

错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。格式:错误级别中间件的 function 处理函数中,必须有 4 个形参,形参顺序从前到后,分别是 (err, req, res, next)。

3.4.4 Express内置的中间件

注意:内置的中间件必须是Express 4.16.0 及以上版本才可以使用

(1)express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)

(2)express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

(3)express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

3.4.5 第三方的中间件

非 Express 官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。

3.5  中间件总结

  1.   一定要在路由之前注册中间件
  2.  客户端发送过来的请求,可以连续调用多个中间件进行处理
  3.  执行完中间件的业务代码之后,不要忘记调用 next() 函数
  4.  为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
  5.  连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294082.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算面临的威胁

目录 一、概述 二、威胁建模分析 2.1 威胁建模的概念 2.2 威胁建模起到的作用 2.3 威胁建模的流程 2.3.1 威胁建模流程图 2.3.2 威胁建模流程内容 2.3.2.1 绘制数据流图 2.3.2.2 威胁识别与分析 2.3.2.2.1 STRIDE威胁分析方法论 2.3.2.3 制定消减措施 2.3.2.3.1 消减…

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

文章目录 摘要1、引言2、 相关工作2.1、用于移动设备的卷积网络2.2、移动设备上的ViT和CNN-ViT混合模型2.3、评估指标 3、CNN-ViT 混合模型在低端CPU上的应用3.1、设计原则3.2、SBCFormer的整体设计3.3、SBCFormer块3.4、改进的注意力机制 4、实验结果4.1、实验设置4.2、ImageN…

手机一键换ip地址,解锁网络自由

在数字化时代,手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展,手机用户对于网络安全和隐私保护的需求也日益增强。其中,IP地址作为手机在网络中的标识,扮演着重要的角色。有时,出于隐私保护或网络…

【数据结构】顺序表的实现——动态分配

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

第23篇:使能异步复位D触发器

Q:在上篇的异步复位D触发器中添加一个使能信号来实现带使能功能的异步复位D触发器。 A:只要复位信号为高电平(RST1)且CLK为时钟上升沿, 如果使能信号也为高电平(EN1),输入数据才会被存储。 带…

MFC(一)搭建空项目

安装MFC支持库 创建空白桌面程序 项目相关设置 复制以下代码 // mfc.h #pragma once #include <afxwin.h>class MyApp : public CWinApp { public:virtual BOOL InitInstance(); };class MyFrame : public CFrameWnd { public:MyFrame();// 消息映射机制DECLARE_…

高度不同的流体瀑布css实现方法

商城商品列表 实现瀑布流展示&#xff0c;通过flex或grid实现会导致每行中的列高度一致&#xff0c;无法达到错落有致的感觉&#xff1b; 为此需要用到&#xff1a; CSS columns 属性 columns 属性是一个简写属性&#xff0c;用于设置列宽和列数。 CSS 语法 columns: column-wi…

【Jmeter+Influxdb+Grafana性能监控平台安装与部署】

JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载&#xff08;winodws&#xff09;Grafana安装与配置 前言 我们在性能测试过程中&#xff0c;在需要较大并发时&#xff0c;为了尽量避免使用GUI界面来节省资源&#xff0c;通常使用命令行…

VR全景赋能智慧农业,打造沉浸式种植体验平台

随着人口的增长&#xff0c;传统农业也正在面临着不一样的挑战&#xff0c;加上很多人对农业的固有印象&#xff0c;很少有年轻人愿意下到农田里&#xff0c;那么该如何提高产量、降低成本以及引导年轻人深刻感受现代农业成为了急需解决的问题。 随着城市化脚步的推进&#xff…

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费&#xff0c;无需服务器&#xff0c;无限空间的图床搭建&#xff08;避坑指南&#xff09; 前提&#xff1a;有github何cloudflare (没有的话注册也很快) 首先&#xff0c;是一个别人写的详细的配置流程&#xff0c;傻瓜式教程&am…

基于SSM框架云趣科技客户管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本客户管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

【问题处理】银河麒麟操作系统实例分享,鲲鹏服务器GaussDB测试ping延迟过高问题

1.问题环境 系统环境 物理机 网络环境 私有网络 硬件环境 机型 TaiShan 200 (Model 2280) (VD) 处理器 HUAWEI Kunpeng 920 5250 内存 32GB*16 显卡 无 主板型号 BC82AMDDRE 架构 ARM 固件版本 iBMC固件版本 3.03.00.31 (U82) 单板ID 0x00a9 BIOS版本 1.8…

应用案例分享|3D视觉引导汽车铅蓄电池自动化拆垛

在汽车制造及相关配套产业链中&#xff0c;铅蓄电池作为关键零部件之一&#xff0c;其生产和处理环节对效率和精准度都有着极高的要求。传统的铅蓄电池拆垛作业往往依赖于人工操作&#xff0c;不仅效率低下&#xff0c;还存在安全隐患。 项目背景 某大型蓄电池企业&#xff0c…

基于UML的系统分析与设计

统一建模语言(Unified Modeling Language&#xff0c;UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言&#xff0c;是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具&#xff0c;独立于任何具体程序设计语言。 毕业设计是实现本科教学培…

OpenHarmony实战:用IPOP调试 OpenHarmony 内核

前言 我使用的是 IPOP V4.1&#xff0c;基于 OpenHarmony 开源系统和 RK3568 开发板&#xff0c;在 PC 上运行此软件&#xff0c;查看运行、错误日志来调试内核。作为网络、嵌入式式内核调试的必备工具&#xff0c;建议同学珍藏。IPOP 运行在 PC 上&#xff0c;操作系统是 Win…

蓝桥杯刷题day13——玩游戏【算法赛】

一、问题描述 小 A 和小 B 两个人在海边找到了 n 个石子&#xff0c;准备开始进行一些游戏&#xff0c;具体规则如下&#xff1a;小 B 首先将 n 个石子分成若干堆&#xff0c;接下来从小 A 开始小 A 和小 B 轮流取石子&#xff0c;每次可以任选一堆石子取走任意个&#xff0c;…

剑指offer--替换空格

一.题目描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。例如"We are happy."替换为"We%20are%20happy. 算法一&#xff1a; 算法1:从头到尾遍历,遇到空格把它替换为%20.时间O(n^2),空间O(1) void replaceSpace(char* s)//…

FreeRTOS 任务挂起和恢复API函数

FreeRTOS 任务挂起和恢复API函数使用 挂起的作用就是当我们需要暂停某任务时候&#xff0c;等过一段时间在运行&#xff0c;这个时候要是使用删除和重建的方法就会当时任务进行时候的变量保存的值。当需要将这个任务停止运行一段时间的将这个任务挂起&#xff0c;当重新进行运…

安装mysql8,启动mysql服务日志 libstdc++.so.6: wrong ELF class: ELFCLASS32

背景&#xff1a;linux centos7.9安装mysql5.7版本&#xff0c;服务启动成功后被告知要求安装mysql8版本&#xff0c;故卸载之后安装mysql8&#xff0c;后启动mysql服务报错提示&#xff1a;libstdc.so.6: wrong ELF class: ELFCLASS32 解决办法&#xff1a; 1、下载安装包li…

第十八章 算法

一、介绍 1.1 什么是算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获…