express框架(二)

news2024/11/16 17:45:34

中间件

什么是中间件

中间件(Middleware)本质是一个回调函数,中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)。

中间件的作用

使用函数封装公共操作,简化代码。

中间件的类型

  • 全局中间件
  • 路由中间件

中间件

案例
  1. 记录日志。
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();

app.get('/home', (req, res) => {
    let { url, ip } = req;
    fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`);
    // 记录日志
    res.send('前台首页');
});

app.get('/admin', (req, res) => {

    res.send('后台首页')
})

app.all('*', (req, res) => {
    res.send('<h1>404 Not Found</h1>')
})

app.listen(3000, () => {
    console.log('服务已经启动...');
})

当所有路由规则都需要记录日志时

const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();

// 1. 申明中间件函数 req:请求对象,res:响应对象,next:指向下一个中间件或路由处理器的函数。
function recordMiddleware(req, res, next) {
    // 2. 提取公共代码
    let { url, ip } = req;
    // 记入日志
    fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`);

    // 4. 调用next,当中间件完成它的任务时,必须调用此函数以将控制权传递给后续的中间件或路由处理器。如果不调用 next(),那么请求将被阻塞,后续的中间件或路由处理器将不会被执行。
    next();
};

// 3. 使用(注册)中间件函数, 这样所有传入的请求都会先经过这个中间件
app.use(recordMiddleware);

app.get('/home', (req, res) => {

    res.send('前台首页');
});

app.get('/admin', (req, res) => {

    res.send('后台首页')
})

app.all('*', (req, res) => {
    res.send('<h1>404 Not Found</h1>')
})

app.listen(3000, () => {
    console.log('服务已经启动...');
})
  1. 路由中间件,实现一个简单的访问控制功能(通常用于登录验证),只有当请求携带正确的 code 查询参数时,才能访问 /admin 路由。如果 code 不正确,则返回 “错误访问” 的消息。其他路由不受此访问控制的影响。
const express = require('express');
const app = express();

function enterCode(req, res, next) {
    if (req.query.code === '111') {
    	// 符合条件继续执行后续逻辑
        next();
    } else {
        res.send('错误访问');
    }
}

app.get('/home', (req, res) => {

    res.send('前台首页');
});
// 需要授权的路由规则
app.get('/admin', enterCode, (req, res) => {

    res.send('后台首页')
})

app.all('*', (req, res) => {
    res.send('<h1>404 Not Found</h1>')
})

app.listen(3000, () => {
    console.log('服务已经启动...');
})

这种简单的认证方式仅适用于示例或测试环境。在生产环境中,应该使用更安全的身份验证机制,如 JWT(JSON Web Tokens)、OAuth 等。

express静态资源中间件

在Node.js中,静态资源通常指的是那些不需要服务器端脚本处理的文件,例如HTML页面、CSS样式表、JavaScript文件、图片、字体文件等。这些文件通常是直接提供给浏览器或者其他客户端的,不需要经过任何处理或修改。
当你构建一个使用Node.js的应用程序时,可能会有一个特定的目录来存放这些静态资源,这个目录一般称为“静态资源目录”或者“网站根目录”。
简单而言,就是浏览器发送请求到服务端=>服务端到某个文件夹中找到对应文件(静态资源)=>响应结果


const express = require('express');
const path = require('path');

const app = express();

// 指定public目录作为静态资源目录
app.use(express.static(path.join(__dirname, 'public')));

// 其他路由和中间件...

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

public参数就是静态资源文件夹的路径。

在根目录创建public,新建index.html写一些内容,访问http://127.0.0.1:3000/index.html

在这里插入图片描述
或者新建css文件夹,创建app.css文件

* {
    margin: 0;
    padding: 0;
}

在这里插入图片描述
同理,静态资源图片也可以这样实现。

静态资源中间件注意事项

  1. index.html 文件为默认打开的资源

直接访问根路径 http://127.0.0.1:3000/,而没有指定具体的文件名,那么服务器会尝试查找这个目录下的index.html文件。这是因为在很多Web服务器配置中,index.html是默认文档,它会在没有指定其他文件的情况下被自动提供给客户端。就会访问index.html中的内容。

  1. 如果静态资源与路由规则同时匹配,谁先匹配上就响应谁,Express处理请求的方式是从第一个注册的路由开始检查(可以理解JS自上而下执行),直到找到匹配为止。因此,如果你有静态资源中间件(如express.static或者pxpress.public)并且还有其他的路由处理器,那么它们的顺序决定了哪个会被首先匹配到。
  • 静态资源优先:如果你想让静态资源被优先处理**,**你需要在你的路由定义之前添加静态资源中间件。这样,任何对静态文件的请求都会被静态资源中间件处理,而不是被路由处理器处理。
// 指定public目录作为静态资源目录
app.use(express.static(path.join(__dirname, 'public')));

app.get('/',(req, res)=> {
	res.send('路由处理器');
})
  • 如果你想让某些特定的URL模式跳过静态资源处理,你应该将这些路由放在静态资源中间件之前。这样,这些特定的URL模式会被路由处理器捕获,而不是由静态资源中间件处理。
// 指定public目录作为静态资源目录
app.get('/',(req, res)=> {
	res.send('路由处理器');
})

app.use(express.static(path.join(__dirname, 'public')));
  1. 路由响应动态资源,静态资源中间件响应静态资源。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kitti数据深度图转点云坐标计算方法与教程(代码实现)

文章目录 前言一、kitti深度图官网介绍1、官网深度图介绍2、深度图读取官网代码(python)3、深度图解读1、数据格式内容2、深度图加工3、深度图转相机坐标深度二、kitti数据内参P矩阵解读1、P2矩阵举例2、内参矩阵 (3x3)3、特殊平移向量(第4列)4、kitti的bx与by解释三、kitti深…

【getshell】phpmyadmin后台getshell(4.8.5)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【getshell】phpmyadmin后台getshell&#xff08;4.8.5&#xff09; 一、进入sql命令输入界面二、上传代码三、getshell 一、进入…

LINQ 和 LINQ扩展方法 (1)

LINQ函数概念&#xff1a; LINQ&#xff08;Language Integrated Query&#xff09;是一种C#语言中的查询技术&#xff0c;它允许我们在代码中使用类似SQL的查询语句来操作各种数据源。这些数据源可以是集合、数组、数据库、XML文档等等。LINQ提供了一种统一的编程模型&#x…

2024/9/11 数学20题(拐点、定积分比大小、二重积分比大小)

拐点&#xff1a; 1000题基础篇&#xff1a; 1000题强化篇&#xff1a; 选b 、 定积分比大小&#xff1a; 二重积分比大小&#xff1a;

【读书笔记-《30天自制操作系统》-19】Day20

本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能&#xff0c;引入了系统调用以及API的概念。首先实现了显示单个字符的API&#xff0c;让应用程序通过传递地址的方式进行调用&#xff1b;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…

【CanMV K230 AI视觉】人脸姿态(脸部朝向)

【CanMV K230 AI视觉】人脸姿态&#xff08;脸部朝向&#xff09; 人脸姿态&#xff08;脸部朝向&#xff09; &#xff08;动态测试效果可以去下面网站自己看。&#xff09; B站视频链接&#xff1a;已做成合集 抖音链接&#xff1a;已做成合集 人脸姿态&#xff08;脸部朝向…

基于yolov8的工程车辆挖掘机叉车卡车检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的工程车辆&#xff08;如挖掘机、叉车、卡车&#xff09;检测系统是一种利用先进深度学习技术的智能监控系统。该系统集成了YOLOv8算法&#xff0c;该算法以其高效的检测速度和准确的识别能力著称&#xff0c;特别适用于实时视频分析场景。 该系统通…

C2 Magic 附工具下载,供学习使用

最近&#xff0c;我们进行了一次安全演练&#xff0c;想要模拟一些复杂的攻击场景并测试我们的防御能力。这时&#xff0c;我想到了一款开源工具&#xff0c;它在处理抗沙箱后门启动和隐蔽ShellCode调用方面表现得非常出色。这款工具的设计理念是为了帮助安全团队更好地应对高级…

使用QT界面运行roslaunch,roslaunch,roscore等

QT通过界面运行rosrun,roslaunch,roscore等 QT 运行roslaunch加入ui界面修改cmakelist运行 使用qt界面运行rosrun&#xff0c;roscore,roslaunch等方法一方法二方法三 QT 运行roslaunch 首先需要使用QT安装好ROS插件&#xff0c;并且配置好环境&#xff0c;这个在之前的文章已…

nvm ls-remote: N/A

背景&#xff1a; 项目因为node版本问题运行失败&#xff0c;在彻底删除node后再重新安装 问题描述&#xff1a; 原因分析&#xff1a; 可能是因为终端不能获取镜像包 解决办法&#xff1a; 【方法一】 输入&#xff1a; step1. export NVM_NODEJS_ORG_MIRRORIndex of …

数据处理与统计分析篇-day01-Linux基础与环境搭建

day01-Linux基础 计算机简介 概述 电子计算机, 电脑, PC, Computer, 就是由 软件 硬件组成的 电子设备. 组成 计算机硬件 CPU(运算器, 控制器) 存储器(内存, 外存) 输入设备 输出设备 计算机软件 系统软件: 充当 用户 和 计算机硬件之间的 桥梁的. PC端: windows, Linu…

Elasticsearch 使用误区之五——单次请求获取大量数据

在使用 Elasticsearch 进行数据查询时&#xff0c;很多开发者、读者会遇到这样的问题&#xff1a;一次性检索大量数据&#xff0c;导致查询速度缓慢、网络延迟增加&#xff0c;甚至影响系统的整体性能。 单次获取过多数据不仅增加了网络传输的负担&#xff0c;还会使查询过程复…

Vue 中的 Web Workers:提升性能与流畅度

大家可能都听到过 Web Workers&#xff0c;那究竟如何使用呢&#xff1f;可以往下了解一下。 1. 什么是 Web Workers&#xff1f; Web Workers 是现代浏览器提供的一种机制&#xff0c;允许我们在主线程之外运行 JavaScript 脚本&#xff0c;避免阻塞 UI 渲染和用户交互操作。…

verilog vscode 与AI 插件

Verilog 轻量化开发环境 背景 笔者常用的开发环境 VIAVDO, 体积巨大&#xff0c;自带编辑器除了linting 能用&#xff0c;编辑器几乎不能用&#xff0c;仿真界面很友好&#xff0c;但是速度比较慢。Sublime Text, 非常好用的编辑器&#xff0c;各种插件使用verilog 非常方便…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展&#xff0c;大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分&#xff0c;企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战&#xff0c;CSGHub、Nvidia和阿里云计算巢强强联手&a…

Frozen CLIP: A Strong Backbone for Weakly Supervised Semantic Segmentation

摘要 弱监督语义分割在图像级标签方面取得了巨大的成就。最近的几种方法使用CLIP模型生成伪标签来训练单个分割模型&#xff0c;而没有尝试将CLIP模型作为主干&#xff0c;直接分割具有图像级标签的对象。在本文中&#xff0c;我们提出了 WeCLIP&#xff0c;一个基于 CLIP 的单…

【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介

自动驾驶决策规划简介 0、前言1、自动驾驶概述1.1 预测&#xff08;Prediction&#xff09;1.2 决策&#xff08;Decision Making&#xff09;1.3 规划&#xff08;Planning&#xff09; 2、自动驾驶历史和背景3、自动驾驶级别和分类4、预测决策规划的重要性4.1 预测的重要性4.…

环境搭建---部署rabbitmq集群

rabbitmq下载&#xff1a;https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.34/rabbitmq-server-generic-unix-3.8.34.tar.xz erlang下载&#xff1a;https://github.com/erlang/otp/releases/download/OTP-24.3.4.1/otp_src_24.3.4.1.tar.gz 配置主机名 …

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …