【Express】中间件

在Express中,中间件是处理HTTP请求的函数。它可以访问请求对象(req)、响应对象(res)和应用程序的请求-响应周期。中间件函数可以执行以下操作:

  1. 执行任何代码。
  2. 修改请求和响应对象。
  3. 终止请求-响应周期。
  4. 调用下一个中间件函数。

在Express中,中间件可以通过以下方式定义和使用:

  1. 使用app.use()方法:app.use()方法用于将中间件函数绑定到应用程序的每个请求。它可以在任何路由之前执行,并且对所有请求都生效。

  2. 使用路由特定的中间件:可以将中间件函数作为参数传递给特定的路由方法,如app.get()app.post()等。这些中间件函数只对该路由起作用。

  3. 使用路径特定的中间件:可以在中间件函数前指定一个路径作为参数,这样只有请求的路径匹配该路径时,对应的中间件才会被执行。

执行顺序取决于它们在代码中的位置。中间件函数按照它们在代码中的顺序依次执行,直到遇到next()方法。next()方法将控制权传递给下一个中间件函数。如果在中间件函数中不调用next(),请求-响应周期将被终止,不会传递给下一个中间件函数或路由处理程序。

中间件在Express中非常强大,它可以用于许多不同的任务,包括身份验证、日志记录、错误处理等。可以使用内置的中间件函数,也可以编写自定义的中间件函数来满足特定的需求。

1. 应用级中间件

// index.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {res.send('这是首页')console.log('这是首页')
})const cb1 = function (req, res, next) {console.log('中间件验证token')next()
}
// 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件
app.use(cb1)
const cb2 = function (req, res) {res.send('查询数据库,返回数据')console.log('查询数据库,返回数据')
}app.get('/example', [cb2])
app.get('/user',(req,res)=> {res.send('user页面')console.log('user页面')
})
app.listen(3000, () => {console.log('Example app listening on port 3000!');
});

依次访问 / , /example , /user 路径,返回值为:

在这里插入图片描述

可见在访问 example 和 user 页面之前都会先执行 cb1 方法。

当然,也可以指定中间件执行的路径,比如 app.use('/user',cb1) 此时只在 user 页面会执行 cb1 方法。

2. 路由级中间件

路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。

// index.js
const express = require('express');
const app = express();
const router = express.Router();router.use((req, res, next) => {console.log('Time: ', Date.now())next()
})
router.get('/', (req, res) => {res.send('Home page')
})
router.get('/about', (req, res) => {res.send('About page')
})
app.use('/', router);app.listen(3000, () => {console.log('Example app listening on port 3000!');
});

app.use()route.use()都是用于向应用程序或特定路由添加中间件的方法。

  1. app.use(): app.use()方法用于将一个中间件函数绑定到应用程序的每个请求。它在任何路由之前,在请求到达服务器时执行。仅当路由路径未指定时,它将被视为全局中间件。

  2. route.use(): route.use()方法用于在特定的路由上添加中间件。在router上的每个请求上执行。router.get()方法定义了一个特定路由的路由处理程序。

3. 错误中间件

// 错误中间件放在各个中间件的最后
app.use((req,res,next)=> {res.status(404).send('Not Found')
})

4. 内置的中间件

express.static 是 Express 唯一内置的中间件。它基于 serve-static,负责在 Express 应用中提托管静态资源。每个应用可有多个静态目录。

app.use(express.static('public'))
app.use(express.static('uploads'))
app.use(express.static('files'))

5. 第三方中间件

安装所需功能的 node 模块,并在应用中加载,可以在应用级加载,也可以在路由级加载。

下面的例子安装并加载了一个解析 cookie 的中间件: cookie-parser

$ npm install cookie-parser
var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')// 加载用于解析 cookie 的中间件
app.use(cookieParser())

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

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

相关文章

机器学习(21)---召回率(recall)、精度(precision)和准确率(accuracy)

文章目录 1. 分布不平衡的数据集2. TP、TN 、FP 、FN3. 混淆矩阵4. 各自的计算公式5. 例题应用 1. 分布不平衡的数据集 1. 精度(precision)和召回率(recall)是衡量机器学习模型性能的重要指标,特别是数据集分布不平衡的…

CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

从月薪8k到月薪30k,自动化测试究竟该怎样学...

绝大多数测试工程师都是从功能测试做起的,工作忙忙碌碌,每天在各种业务需求学习和点点中度过,过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展,从业人员能力的整体进步,软件测试需要具备的能力要…

在Openresty中使用lua语言向请求浏览器返回请求头User-Agent里边的值

可以参考《Linux学习之Ubuntu 20.04在https://openresty.org下载源码安装Openresty 1.19.3.1,使用systemd管理OpenResty服务》安装Openresty。 然后把下边的内容写入到openresty配置文件/usr/local/openresty/nginx/conf/nginx.conf(根据实际情况进行选…

Python数据挖掘项目实战——自动售货机销售数据分析

摘要:本案例将主要结合自动售货机的实际情况,对销售的历史数据进行处理,利用pyecharts库、Matplotlib库进行可视化分析,并对未来4周商品的销售额进行预测,从而为企业制定相应的自动售货机市场需求分析及销售建议提供参…

一文拿捏对象内存布局及JMM(JAVA内存模型)

1 JMM(Java Memory Model) 1 概述 Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的一组规则或者规范。通过这些规则、规范定义了程序中各个变量的访问方式。jvm运行的程序的实体是线程,而每个线程运行时&am…

FPGA project : flash_secter_erase

flash的指定扇区擦除实验。 先发写指令,再进入写锁存周期等待500ns,进入写扇区擦除指令,然后写扇区地址,页地址,字节地址。即可完成扇区擦除。 模块框图: 时序图: 代码: module…

SpringBootCms

SpringBootCMS,极速开发,动态添加字段,自定义标签,动态创建数据库表并crud数据,数据库备份、还原,动态添加站点(多站点功能),一键生成模板代码,让您轻松打造自己的独立网站&#xff…

好莱坞编剧大罢工终于结束;与OpenAI创始人共进早餐;使用DALL-E 3制作绘本分享;生成式AI的基础设施架构 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 好莱坞编剧大罢工终于结束:简单说就是AI妥协了 https://www.wgacontract2023.org/the-campaign/summary-of-the-2023-wga-…

web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-) web面试题专栏:点击此处 文章目录 深拷贝和浅拷贝的区别浅拷贝示例深拷贝示例 特殊对象…

安全的Sui Move是Web3大规模采用之路的基石

没有信任,就没有Web3的大规模采用。还有其他重要障碍阻碍了首个十亿用户的到来,包括令人困惑的用户体验、复杂的身份验证模式以及不确定的监管体系,但所有障碍中,要数大多数人对区块链技术持怀疑和不信任态度最严重。 对于许多人…

分布式文件服务器——Windows环境MinIO的三种部署模式

上节简单聊到MinIO:分布式文件存储服务——初识MinIO-CSDN博客,但没具化,本节开始展开在Windows环境下 MinIO的三种部署模式:单机单节点、单机纠删码、集群模式。 部署的几种模式简要概括 所谓单机单节点模式:即MinI…

12种发朋友圈黄金模板

随着朋友圈在社交媒体中的日渐重要,越来越多的企业开始将其作为一种有效的营销渠道。但是,在朋友圈中发布内容并不是一件容易的事情,如何创造有吸引力和互动性的内容,成为了所有运营人员所面临的问题。 小编将分享12种发朋友圈黄金…

【深度学习实验】卷积神经网络(八):使用深度残差神经网络ResNet完成图片多分类任务

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集(CIFAR10Dataset) a. read_csv_labels() b. CIFAR10Dataset 2. 构建模型(FeedForward&#x…

计算机视觉(Computer Vision, CV)是什么?

什么是计算机视觉 近年来,计算机视觉 (Computer Vision,简称CV) 不断普及,已成为人工智能 (AI) 增长最快的领域之一。计算机视觉致力于使计算机能够识别和理解图像和视频中的物体和人。 计算机视觉应用程序使用来自传感设备、人工智能、机器…

kafka 开启认证授权

前言 1、前面自己写了一篇关于各个环境各个模式的安装的文章,大家可以去看看 kafka各种环境安装(window,linux,docker,k8s),包含KRaft模式 2、使用版本 kafka_2.13-3.4.1 3、kafka验证方式,有两大类如下,文档内容在 kafka官方文档的 第七节…

WAF绕过-信息收集之反爬虫延时代理池 46

老师用的阿里云的服务器,装了宝塔和安全狗, 演示案例 Safedog-默认拦截机制分析绕过-未开CC 没有打开防止流量攻击的安全狗, 而这里,get请求可以直接看到返回结果,而head就不行。 我们就给工具换成get请求 在没有c…

c++视觉处理----绘制直方图,H—S直方图,二维H—S直方图,RGB三色直方图

直方图:cv::calcHist() cv::calcHist() 是 OpenCV 中用于计算直方图的函数。直方图是一种用于可视化图像亮度或颜色分布的工具。这函数通常应用于灰度图像或彩色图像的各个通道。以下是 cv::calcHist() 函数的基本语法和参数: void cv::calcHist(const…

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分:边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分:应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分:挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

树莓派部署.net core控制台程序

1、在自己的电脑上使用VS写一个Net6.0的控制台程序,我假设我就写个Helloworld。 发布项目 使用mobaxterm上传程序 就传三个文件就行 回到在mobaxterm中,进入目录输入:cd consolepublish,运行程序: dotnet ConsoleApp1.dll 输出h…