当前位置: 首页 > news >正文

node.js知识系列(3)-每天了解一点

目录

    • 1. Express.js 中的中间件
    • 2. 处理路由和请求
    • 3. RESTful 路由
    • 4. 身份验证和授权
    • 5. 视图引擎
    • 6. 错误处理中间件
    • 7. 文件上传处理
    • 8. Cookie 和 Session 管理
    • 9. 路由参数和查询参数
    • 10. 处理跨域请求(CORS)


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


1. Express.js 中的中间件

中间件是 Express.js 的核心概念之一,它是一个函数,可以处理 HTTP 请求和响应。中间件可以在请求到达路由处理函数之前、之后或中间进行操作,用于执行各种任务,如身份验证、日志记录、数据转换等。

中间件的作用包括:

  • 请求预处理:在路由处理函数之前执行一些必要的操作,如解析请求体、检查身份验证等。
  • 路由级别中间件:为特定路由或路由组设置中间件,以在特定路由上执行特定任务。
  • 错误处理:处理在路由处理过程中产生的错误,以确保错误的友好响应。
  • 静态文件服务:通过中间件提供静态文件(如 CSS、JavaScript、图像等)。

Express.js 的中间件可以使用 app.use() 或路由特定的 app.METHOD() 方法添加到应用程序中。

2. 处理路由和请求

在 Express.js 中,路由用于确定应该执行哪个处理函数以响应特定的 HTTP 请求。可以使用 app.METHOD(path, handler) 方法定义路由,其中 METHOD 是 HTTP 请求方法(如 GET、POST、PUT、DELETE),path 是路由的 URL 路径,handler 是路由处理函数。

例如:

const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('Hello, World!');
});

上述代码定义了一个 GET 请求的根路由,当用户访问根路径时,会触发路由处理函数,响应 “Hello, World!”。

3. RESTful 路由

RESTful 路由是一种遵循 REST(Representational State Transfer)原则的路由设计风格,它将资源映射到 URL 和 HTTP 方法上。在 Express.js 中,可以使用 HTTP 方法和 URL 来定义 RESTful 路由,例如:

app.get('/api/posts', (req, res) => {// 获取所有文章列表
});app.get('/api/posts/:id', (req, res) => {// 获取特定文章
});app.post('/api/posts', (req, res) => {// 创建新文章
});app.put('/api/posts/:id', (req, res) => {// 更新特定文章
});app.delete('/api/posts/:id', (req, res) => {// 删除特定文章
});

上述示例中,通过使用不同的 HTTP 方法和 URL,可以定义获取、创建、更新和删除资源的路由。这符合 RESTful 设计原则,使 API 更具可读性和一致性。

4. 身份验证和授权

在 Express.js 中,身份验证和授权可以通过中间件来实现。常用的身份验证中间件包括 Passport.js,它支持多种身份验证策略,如本地用户名密码、OAuth、JWT 等。

以下是使用 Passport.js 进行身份验证的示例:

const passport = require('passport');// 配置本地用户名密码策略
passport.use(new LocalStrategy((username, password, done) => {// 根据用户名和密码验证用户身份// 如果验证成功,调用 done(null, user);如果失败,调用 done(null, false)}
));// 在路由中使用身份验证中间件
app.post('/login',passport.authenticate('local', {successRedirect: '/dashboard',failureRedirect: '/login',})
);

授权可以通过在路由处理函数中检查用户的角色或权限来实现,以决定是否允许访问特定资源。

5. 视图引擎

Express.js 支持多种视图引擎,用于渲染动态内容并生成 HTML 页面。一些常见的视图引擎包括 EJS、Pug(之前称为 Jade)、Handlebars 等。

以下是使用 EJS 视图引擎的示例:

const express = require('express');
const app = express();// 设置视图引擎
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));app.get('/',(req, res) => {// 渲染视图并传递数据res.render('index', { title: 'Express App' });
});

在上述示例中,首先通过 app.set 方法设置视图引擎为 EJS,并指定视图文件的目录。然后,在路由处理函数中使用 res.render 渲染视图,将数据传递给视图以动态生成页面内容。视图引擎使得创建动态网页变得更加容易。

6. 错误处理中间件

错误处理中间件是 Express.js 中用于处理应用程序中出现的错误的中间件。它们的主要作用是捕获和处理在请求处理过程中发生的异常,以确保应用程序的稳定性,并向客户端发送适当的错误响应。

错误处理中间件通常是一个函数,接收四个参数:err(错误对象)、req(请求对象)、res(响应对象)和 next(下一个中间件函数)。当某个中间件或路由处理函数中抛出错误时,Express.js 会将控制权交给错误处理中间件。

以下是一个简单的错误处理中间件示例:

app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something went wrong!');
});

在上述示例中,如果在请求处理过程中抛出错误,它将被捕获并导致服务器返回状态码 500 的错误响应。

7. 文件上传处理

在 Express.js 中处理文件上传通常涉及使用第三方中间件,如 multer。以下是一个使用 multer 处理文件上传的示例:

const express = require('express');
const multer = require('multer');
const app = express();// 配置文件上传
const storage = multer.diskStorage({destination: (req, file, cb) => {cb(null, 'uploads/');},filename: (req, file, cb) => {cb(null, file.originalname);},
});const upload = multer({ storage });// 处理文件上传
app.post('/upload', upload.single('file'), (req, res) => {res.send('文件上传成功');
});app.listen(3000, () => {console.log('服务器正在监听端口 3000');
});

在上述示例中,使用 multer 中间件来配置文件上传,然后在路由中使用 upload.single('file') 处理单个文件上传。上传的文件将被保存到指定的目录。

8. Cookie 和 Session 管理

在 Express.js 中,可以使用中间件来处理 Cookie 和 Session。常用的中间件包括 cookie-parser 用于解析 Cookie 和 express-session 用于管理 Session。

  • 使用 cookie-parser 中间件可以解析客户端发送的 Cookie。
const cookieParser = require('cookie-parser');
app.use(cookieParser());
  • 使用 express-session 中间件可以创建和管理用户 Session。
const expressSession = require('express-session');
app.use(expressSession({secret: 'mySecretKey',resave: false,saveUninitialized: true,
}));

上述配置中的 secret 是一个用于加密 Session 数据的秘密密钥。使用 Session,您可以存储用户的状态信息,以便在不同请求之间保持用户的登录状态等。

9. 路由参数和查询参数

在 Express.js 中,路由参数和查询参数是用于从客户端请求中提取信息的两种不同方式。

  • 路由参数:是 URL 路径中的一部分,通常用于传递标识符或值。在路由定义中使用冒号 : 来定义参数,然后通过 req.params 对象访问它们。
app.get('/users/:id', (req, res) => {const userId = req.params.id; // 提取路由参数
});
  • 查询参数:是 URL 中的键值对,通常用于筛选或过滤数据。查询参数位于 URL 的问号后面,可以使用 req.query 对象访问它们。
app.get('/search', (req, res) => {const searchTerm = req.query.q; // 提取查询参数
});

通过路由参数和查询参数,可以从客户端请求中提取特定的信息,以便在路由处理函数中进行相应的操作。

10. 处理跨域请求(CORS)

要在 Express.js 中处理跨域请求,您可以使用 cors 中间件或手动设置响应头。cors 中间件使跨域请求处理更加方便。

首先,使用 cors 中间件:

const cors = require('cors');// 允许所有来源的跨域请求
app.use(cors());// 或者指定特定来源
const corsOptions = {origin: '<http://example.com>',
};
app.use(cors(corsOptions));

或者,手动设置响应头来允许跨域请求:

app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', '<http://example.com>');res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');next();
});

以上两种方式都可以配置 Express.js 应用程序以允许特定来源的跨域请求,并设置允许的 HTTP 方法和请求头。这有助于确保客户端可以安全地与服务器通信,而不受同源策略的限制。

相关文章:

node.js知识系列(3)-每天了解一点

目录 1. Express.js 中的中间件2. 处理路由和请求3. RESTful 路由4. 身份验证和授权5. 视图引擎6. 错误处理中间件7. 文件上传处理8. Cookie 和 Session 管理9. 路由参数和查询参数10. 处理跨域请求&#xff08;CORS&#xff09; &#x1f44d; 点赞&#xff0c;你的认可是我创…...

Zabbix监控系统 自定义监控项、自动发现与自动注册

Zabbix监控系统 自定义监控项、自动发现与自动注册 一、自定义监控内容部署实例二、zabbix 自动发现与自动注册部署实例2.1 部署zabbix自动发现 一、自定义监控内容部署实例 案列&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#…...

Python信号之分享

在了解了Linux的信号基础之后&#xff0c;Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号&#xff0c;典型的操作包括预设信号处理函数&#xff0c;暂停并等待信号&#xff0c;以及定时发出SIGALRM等。要注意&#xff0c;signal包主要是针…...

环信web、uniapp、微信小程序SDK报错详解---登录篇

项目场景&#xff1a; 记录对接环信sdk时遇到的一系列问题&#xff0c;总结一下避免大家再次踩坑。这里主要针对于web、uniapp、微信小程序在对接环信sdk时遇到的问题。主要针对报错400、404、401、40 (一) 登录用户报400 原因分析&#xff1a; 从console控制台输出及networ…...

DAZ To UMA⭐五.模型在Blender中的配置教程

文章目录 🟥 创建符合UMA的材质球属性1️⃣ 合并材质球🎁 选择材质球🎁 合并材质球🎁 删除多余材质球2️⃣ 将身体按材质球拆分🎁 进入身体编辑模式🎁 全选身体🎁 按材质分割身体🎁 重命名不同部位3️⃣ 将其余部位进行拆分🟧 更正选择缩放🟩 更新骨骼结构…...

网络安全工具汇总

网络安全工具汇总 1. 前言1.1. 工具提供 2. 漏洞库3. 杂项3.1. topology-scanner3.2. MDUT3.3. 404 4. 插件工具4.1. 浏览器插件4.1.1. Heimdallr4.1.2. HackTools4.1.3. SwitchyOmega4.1.4. fofa_view4.1.5. mitaka 4.2. CS插件4.2.1. taowu-cobalt_strike4.2.2. OLa4.2.3. Z1…...

day-65 代码随想录算法训练营(19)图论 part 04

463.岛屿的周长 分析&#xff1a; 1.陆地的旁边是海面&#xff0c;存在周长2.陆地在边界上&#xff0c;存在周长 思路一&#xff1a;深度优先遍历 1.通过记录访问情况来访问数据 class Solution { public:int direct[4][2]{{0,1},{0,-1},{1,0},{-1,0}};int res0;void dfs(…...

C++ - 完美语义(右值引用的中篇) - lambda表达式

前言 之前对右值引用的理解&#xff0c;用使用场景做了详细说明&#xff0c;具体看博客&#xff1a;C - 右值引用 和 移动拷贝-CSDN博客 在 有值引用 当中还有一个 完美转发&#xff0c;请看本篇博客。 完美转发 我们现在看这个例子&#xff1a; void Fun(int& x) { …...

常见排序算法详解

目录 排序的相关概念 排序&#xff1a; 稳定性&#xff1a; 内部排序&#xff1a; 外部排序&#xff1a; 常见的排序&#xff1a; 常见排序算法的实现 插入排序&#xff1a; 基本思想&#xff1a; 直…...

监控搭建-Prometheus

监控搭建-Prometheus 1、背景2、目标3、选型4、Prometheus4.1、介绍4.2、架构4.3、构件4.4、运行机制4.5、环境介绍4.6、数据准备4.7、网络策略4.7.1、主机端口放行4.7.2、设备端口放行 4.8、部署4.9、验证4.10、配置 1、背景 随着项目信息化进程的推进&#xff0c;操作系统、…...

指纹浏览器开发指南-EasyBR

想开发一款指纹浏览器&#xff0c;指纹浏览器名字叫做EasyBR&#xff0c;大致构思了下开发的步骤。 EasyBR指纹浏览器开发指南&#xff1a; 后台技术、前端技术和指纹修改 简介&#xff1a; EasyBR指纹浏览器是一款旨在提供个性化服务和广告定位的浏览器&#xff0c;通过收…...

qml入门

window import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.5Window { //root控件&#xff0c;父窗口是主界面width: 640height: 480visible: true//相对于父控件的偏移量x: 100y:100minimumWidth: 400 //最小宽度minimumHeight: 300 //最小高度ma…...

一文熟练使用python修改Excel中的数据

使用python修改Excel中的内容 1.初级修改 1.1 openpyxl库的功能&#xff1a; openpyxl模块是一个读写Excel 2010文档的Python库&#xff0c;如果要处理更早格式的Excel文档&#xff0c;需要用到额外的库&#xff0c;例如Xlwings。openpyxl是一个比较综合的工具&#xff0c;能…...

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…...

【物联网】Arduino+ESP8266物联网开发(一):开发环境搭建 安装Arduino和驱动

ESP8266物联网开发 1.开发环境安装 开发软件下载地址&#xff1a; 链接: https://pan.baidu.com/s/1BaOY7kWTvh4Obobj64OHyA?pwd3qv8 提取码: 3qv8 1.1 安装驱动 将ESP8266连接到电脑上&#xff0c;安装ESP8266驱动CP210x 安装成功后&#xff0c;打开设备管理器&#xff0c…...

自定义UI对象转流程节点

自定义UI对象转流程节点 实体自定义对象转bpmn activitiy学习 (动态加签&#xff0c;动态流程图&#xff0c;指定节点跳转&#xff0c;指定多人节点跳转) 前端页面仿的这个 提供一个思路 实体 ActivitiValueVo import io.swagger.annotations.ApiModel; import io.swagger.a…...

P1-P5_动手学深度学习-pytorch(李沐版,粗浅的笔记)

目录 预告  1.学习深度学习的关键是动手  2.什么是《动手学深度学习》  3.曾经推出的版本&#xff08;含github链接&#xff09; 一、课程安排  1.目标  2.内容  3.上课形式  4.你将学到什么  5.资源 二、深度学习的介绍  1.AI地图  2.深度学习在一些应用上…...

Android Studio修改模拟器AVD Manger目录

Android Studio修改虚拟机AVD Manger目录 1、在AS的设备管理器Device Manager中删除原来创建的所有虚拟机&#xff08;Android Virtual Device&#xff09;&#xff1b; 2、新建一个自定义的AVD目录&#xff0c;例如&#xff1a;D:\Android\AndroidAVD 3、在高级系统设置中增加…...

STM32--MQ2烟雾传感器

本文主要介绍STM32F103C8T6和烟雾传感器模块的控制算法 简介 烟雾模块选用MQ-2气体传感器&#xff0c;根据传感器的电导率随空气中可燃气体浓度的增加而增大的特性检测空气中可燃气体&#xff0c;然后将电导率的变化转换成对应的电信号 MQ系列烟雾传感分类如下&#xff1a; 该…...

GitHub要求开启2FA,否则不让用了。

背景 其实大概在一个多月前&#xff0c;在 GitHub 网页端以及邮箱里都被提示&#xff1a;要求开启 2FA &#xff0c;即双因子认证&#xff1b;但是当时由于拖延症和侥幸心理作祟&#xff0c;直接忽略了相关信息&#xff0c;毕竟“又不是不能用”。。 只到今天发现 GitHub 直接…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...