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 方法和请求头。这有助于确保客户端可以安全地与服务器通信,而不受同源策略的限制。

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

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

相关文章

Android PackageManager的妙用

判断是否是系统应用 private boolean isSystemApp(String pkgName) {if (null pkgName || TextUtils.isEmpty(pkgName)) {return false;}try {PackageInfo info getPackageManager().getPackageInfo(pkgName, PackageManager.GET_SIGNATURES);if ((info.applicationInfo.flag…

【Docker】Docker的工具实践及root概念,时间戳的概念和Docker容器安全性设置的详细讲解

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

运行软件提示丢失msvcr120.dll文件怎么办?msvcr120.dll丢失的5个最新解决方法

找不到msvcr120.dll是一个常见的错误信息&#xff0c;通常会在用户尝试运行某些程序或游戏时出现。msvcr120.dll是 Windows 操作系统中的一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;对于许多程序和游戏的正常运行至关重要。 当用户遇到找不到…

dockers --cap-add 哪些值可以设置

--cap-add 参数可以用于向 Docker 容器添加不同的权限。除了 NET_ADMIN&#xff0c;还有一些其他常用的权限值&#xff0c;包括&#xff1a; SYS_ADMIN&#xff1a;添加系统管理员权限&#xff0c;允许容器内的进程执行系统级别的管理操作&#xff0c;如挂载文件系统、设置时间…

使用NVM管理nodejs

Windows 1、查看本地安装的所有版本 nvm list 查看电脑上已安装的nodejs版本号 nvm list available 显示所有可下载的nodejs版本号 2、安装需要使用的node版本号 nvm install 10.16.0 3、使用该版本号 nvm use 10.16.0 4.卸载nodejs版本号 nvm uninstall 10.16.0 ⑧nvm常用…

结构性货币政策工具详解:碳减排支持工具、支小再贷款、再贴现等

一、概述 近年来&#xff0c;人民银行认真贯彻落实党中央、国务院决策部署&#xff0c;发挥好货币政策工具的总量和结构双重功能&#xff0c;围绕支持普惠金融、绿色发展、科技创新等国民经济重点领域和薄弱环节&#xff0c;服务经济高质量发展&#xff0c;逐步构建了适合我国…

POI 和 EasyExcel 操作 Excel

一、概述 目前操作 Excel 比较流行的就是 Apache POI 和阿里巴巴的 easyExcel。 1.1 POI 简介 Apache POI 是用 Java 编写的免费开源的跨平台的 Java API&#xff0c;Apache POI 提供 API 给 Java 程序对 Microsoft Office 格式文档读和写的常用功能。POI 为 “Poor Obfuscati…

一般香港服务器带宽选多大够用?(带宽计算方法)

​  在海外IDC市场份额中&#xff0c;香港服务器依托自身优越的服务器资源条件&#xff0c;在各个行业中发挥的重要作用。但是&#xff0c;不同业务对网络带宽的要求各不相同&#xff0c;弄清楚如何计算带宽需求对于确保业务平稳运行至关重要&#xff0c;最好从一开始就使用正…

039:mapboxGL更换地图上的鼠标样式

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中更换地图上的鼠标的样式。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共74行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…

012-第二代硬件选型

第二代硬件选型 文章目录 第二代硬件选型项目介绍重新换平台缘由X86 && Arm 架构切换 ARM Linux 硬件选型系统确定Qt 版本确定总结一下 关键字&#xff1a; Qt、 Qml、 Arm、 X86、 linux 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…

判断一个整数是否回文

回文数字的定义&#xff1a;第一位和最后一位相等&#xff0c;第二位和倒数第二位相等...依次类推&#xff0c;比如1221,12321等等&#xff0c;也就是说一个数字如果是回文&#xff0c;那么将它反转之后&#xff0c;一定和原来的值相等 解法一&#xff1a;投机取巧&#xff0c…

学生管理系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言0. 准备0-0 头文件0-1 封装学生和结点数据0-2 创建头结点0-3 系统功能提示0-4 根据用户输入选择功能 1. 录入学生信息1-0 实现循环录入1-1 程序暂停和清空控制台…

【jvm--方法区】

文章目录 1. 栈、堆、方法区的交互关系2. 方法区的内部结构3. 运行时常量池4. 方法区的演进细节5. 方法区的垃圾回收 1. 栈、堆、方法区的交互关系 方法区的基本理解&#xff1a; 方法区&#xff08;Method Area&#xff09;与 Java 堆一样&#xff0c;是各个线程共享的内存区…

4.MySql安装配置(更新版)

MySql安装配置 无论计算机是否有安装其他mysql&#xff0c;都不要卸载。 只要确定大版本是8即可&#xff0c;8.0.33 8.0.34 差别不大即可。 MySql下载安装适合电脑配置属性有关&#xff0c;一次性安装成功当然是非常好的&#xff0c;因为卸载步骤是非常麻烦的 如果第一次安装…

医疗器械标准目录汇编2022版共178页(文中附下载链接!)

为便于更好地应用医疗器械标准&#xff0c;国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域&#xff0c;编排形成《医疗器械标准目录汇编&#xff08;2022版&#xff09;》 该目录汇编分为通用技术领域和专业技术领域两大类&#xff0c;通用…

NoSQL Redis

NoSQL Redis 1、数据库1.1关系型数据库1.2非关系型数据库1.3关系型和非关系型区别 2、非关系型数据库应用场景3、存储结构4、redis4.1redis概述4.2Redis 优点4.3Redis为什么这么快&#xff1f; 5、部署redis6、redis基础操作 1、数据库 1.1关系型数据库 关系型数据库是一个结…

互斥锁、条件变量、信号量以及适用场景

文章目录 互斥锁互斥锁实战过程中常用方法 条件变量条件变量实战过程中常用方法 信号量信号量的常用方法 生产者和消费者问题一个粗略版本的生产者消费者代码(如果只使用了互斥锁)一个改进版本的生产者消费者代码(使用了互斥锁和条件变量)一个最终版本的生产者消费者代码(使用了…

options.css 内容优化2 --chatPGT

问&#xff1a; options.css 内容优化,功能列表的li,设置成点击按钮的样式&#xff0c;需要有鼠标经过高亮&#xff0c;选中时按钮背景颜色和未选中时的背景色需要有肉眼可见的色差 gpt: 为了使左侧功能列表的每个 <li> 元素看起来像按钮&#xff0c;并且在鼠标经过时…

机械臂抓取的产业落地进展与思考

工业机械臂是一种能够模拟人类手臂动作的机械装置&#xff0c;具有高精度、高速度和高灵活性的特点。近年来&#xff0c;随着人工智能和机器人技术的快速发展&#xff0c;机械臂在工业生产、物流仓储、医疗护理等领域得到了广泛应用。机械臂抓取技术作为机械臂的核心功能之一&a…

广东省科学技术厅关于2023年度广东省科学技术奖提名工作的通知

粤科函区字〔2023〕1290号 各有关单位&#xff08;专家&#xff09;&#xff1a; 科技奖励制度是党和政府长期坚持的一项重要科技制度&#xff0c;为深入实施创新驱动发展战略&#xff0c;加快建设更高水平的科技创新强省和粤港澳大湾区国际科技创新中心&#xff0c;进一步体现…