Node.js 全栈开发进阶篇

​🌈个人主页:前端青山
🔥系列专栏:node.js篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来node.js篇专栏内容:node.js- 全栈开发进阶篇

前言

大家好,我是青山。在上一篇文章中,我们从零开始学习了 Node.js 和 MongoDB 的基本概念,并构建了一个简单的全栈应用。今天我们将在这些基础上更进一步,探讨一些高级功能,如路由、中间件、错误处理和安全性。通过这些内容,你将能够构建更加健壮和安全的全栈应用。

目录

前言

二、路由管理

2.1 什么是路由?

2.2 安装 Express

2.3 创建路由

2.4 代码解释

三、中间件

3.1 什么是中间件?

3.2 日志中间件

3.3 代码解释

四、错误处理

4.1 错误处理中间件

4.2 代码解释

五、安全性

5.1 使用 Helmet

5.2 配置 Helmet

5.3 代码解释

六、总结

二、路由管理

2.1 什么是路由?

路由是指根据不同的 URL 地址,将请求分发到不同的处理函数。在 Node.js 中,我们可以使用 Express 框架来简化路由管理。

2.2 安装 Express

Express 是一个轻量级的 Web 框架,可以帮助我们快速构建 Web 应用。首先,我们需要安装 Express:

npm install express

2.3 创建路由

修改 index.js 文件,引入 Express 并创建路由:

// index.js
const express = require('express');
const { MongoClient } = require('mongodb');const app = express();
const port = 3000;
const uri = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });app.use(express.json()); // 解析 JSON 请求体app.get('/', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const query = {};const cursor = collection.find(query);if ((await cursor.count()) === 0) {res.status(200).send('No items found');} else {const items = await cursor.toArray();res.status(200).json(items);}} catch (err) {console.error(err);res.status(500).send('Internal Server Error');} finally {await client.close();}
});app.post('/items', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const newItem = req.body;const result = await collection.insertOne(newItem);res.status(201).json(result.ops[0]);} catch (err) {console.error(err);res.status(500).send('Internal Server Error');} finally {await client.close();}
});app.listen(port, () => {console.log(`Server running at http://127.0.0.1:${port}`);
});

2.4 代码解释

  • express.json():解析 JSON 请求体。
  • app.get('/'):处理 GET 请求,返回所有项。
  • app.post('/items'):处理 POST 请求,插入新项。

三、中间件

3.1 什么是中间件?

中间件是处理请求和响应的函数,它们可以执行任何操作,如日志记录、身份验证等。中间件可以按顺序链式调用。

3.2 日志中间件

创建一个日志中间件,记录每个请求的信息:

// index.js
const express = require('express');
const { MongoClient } = require('mongodb');const app = express();
const port = 3000;
const uri = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });// 日志中间件
app.use((req, res, next) => {console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);next();
});app.use(express.json()); // 解析 JSON 请求体// 路由
app.get('/', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const query = {};const cursor = collection.find(query);if ((await cursor.count()) === 0) {res.status(200).send('No items found');} else {const items = await cursor.toArray();res.status(200).json(items);}} catch (err) {console.error(err);res.status(500).send('Internal Server Error');} finally {await client.close();}
});app.post('/items', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const newItem = req.body;const result = await collection.insertOne(newItem);res.status(201).json(result.ops[0]);} catch (err) {console.error(err);res.status(500).send('Internal Server Error');} finally {await client.close();}
});app.listen(port, () => {console.log(`Server running at http://127.0.0.1:${port}`);
});

3.3 代码解释

  • app.use((req, res, next) => { ... }):定义日志中间件,记录请求的时间、方法和 URL。
  • next():调用下一个中间件或路由处理函数。

四、错误处理

4.1 错误处理中间件

错误处理中间件用于捕获并处理应用程序中的错误。它们通常定义在所有路由之后。

// index.js
const express = require('express');
const { MongoClient } = require('mongodb');const app = express();
const port = 3000;
const uri = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });// 日志中间件
app.use((req, res, next) => {console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);next();
});app.use(express.json()); // 解析 JSON 请求体// 路由
app.get('/', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const query = {};const cursor = collection.find(query);if ((await cursor.count()) === 0) {res.status(200).send('No items found');} else {const items = await cursor.toArray();res.status(200).json(items);}} catch (err) {next(err); // 将错误传递给错误处理中间件} finally {await client.close();}
});app.post('/items', async (req, res, next) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const newItem = req.body;const result = await collection.insertOne(newItem);res.status(201).json(result.ops[0]);} catch (err) {next(err); // 将错误传递给错误处理中间件} finally {await client.close();}
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Internal Server Error');
});app.listen(port, () => {console.log(`Server running at http://127.0.0.1:${port}`);
});

4.2 代码解释

  • next(err):将错误传递给错误处理中间件。
  • app.use((err, req, res, next) => { ... }):定义错误处理中间件,捕获并处理错误。

五、安全性

5.1 使用 Helmet

Helmet 是一个 Express 中间件,可以帮助你设置各种 HTTP 头,以提高应用的安全性。首先,安装 Helmet:

npm install helmet

5.2 配置 Helmet

在 index.js 文件中配置 Helmet:

// index.js
const express = require('express');
const { MongoClient } = require('mongodb');
const helmet = require('helmet');const app = express();
const port = 3000;
const uri = 'mongodb://127.0.0.1:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });// 配置 Helmet
app.use(helmet());// 日志中间件
app.use((req, res, next) => {console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);next();
});app.use(express.json()); // 解析 JSON 请求体// 路由
app.get('/', async (req, res) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const query = {};const cursor = collection.find(query);if ((await cursor.count()) === 0) {res.status(200).send('No items found');} else {const items = await cursor.toArray();res.status(200).json(items);}} catch (err) {next(err); // 将错误传递给错误处理中间件} finally {await client.close();}
});app.post('/items', async (req, res, next) => {try {await client.connect();console.log('Connected to MongoDB');const database = client.db('myFirstDatabase');const collection = database.collection('items');const newItem = req.body;const result = await collection.insertOne(newItem);res.status(201).json(result.ops[0]);} catch (err) {next(err); // 将错误传递给错误处理中间件} finally {await client.close();}
});// 错误处理中间件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Internal Server Error');
});app.listen(port, () => {console.log(`Server running at http://127.0.0.1:${port}`);
});

5.3 代码解释

  • app.use(helmet()):配置 Helmet,设置各种 HTTP 头以提高安全性。

六、总结

通过本文,我们深入探讨了 Node.js 和 MongoDB 的高级功能,包括路由管理、中间件、错误处理和安全性。我们学会了如何使用 Express 框架来管理路由,如何使用中间件来记录日志和处理错误,以及如何使用 Helmet 来提高应用的安全性。

Node.js 和 MongoDB 的结合,为我们提供了强大的全栈开发能力。希望本文能帮助你进一步提升 Node.js 和 MongoDB 的技能,构建更加健壮和安全的全栈应用。

如果你有任何问题或建议,欢迎留言交流。期待在未来的文章中继续与你分享更多技术知识。

希望这篇文章对你有所帮助!如果有任何疑问或需要进一步的解释,请随时联系我。祝你在全栈开发的道路上越走越远!

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

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

相关文章

密码学与数学证明。

通常的数学证明工具主要有:以平行公设为基础的几何证明体系,以牛顿三定律为基础的经典力学证明体系,以四则计算为基础的计算证明方法,以正则三段论为基础的断言思证系统,以数学归纳法和夹挤定理为基础的包络收敛分析证…

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格,并且求第二列所有价格的和方法一:通过添加文件输入元素上传csv完整(正确)代码之前的错误部分因为价格是小数,所以下面的代码出错。如果把parseFloat改成parseInt,那么求和没有意义…

C语言初阶必会的练习题(3)之位操作符(^ 、、>>等)的应用

C语言初阶必会的练习题(3) 放在最前面的1、不允许创建临时变量,交换两个整数的内容1.1、分析:见代码注释(a)方法 1(b)方法 2 1.2、结果展示方法 1 的 结果:方法 2 的 结果…

基于SSM框架的乡村农户对口扶贫系统

基于SSM框架的乡村农户对口扶贫系统。 设计步骤: 项目架构创建:首先创建项目的基本架构,包括com.zc.xxx路径下的文件和resources资源文件夹。 SSM架构:使用Spring、SpringMVC、MyBatis作为后端架构,采用POJO—Dao—…

前端Web用户 token 持久化

用户 token 持久化 业务背景:Token的有效期会持续一段时间,在这段时间内没有必要重复请求token,但是pinia本身是基于内存的管理方式,刷新浏览器Token会丢失,为了避免丢失需要配置持久化进行缓存 基础思路&#xff1a…

【学习笔记】SAP ABAP——OPEN SQL(一)【INTO语句】

【INTO语句】 结构体插入(插入一条语句时) SELECT...INTO [CORRESPONDING FIELDS OF] <wa> FROM <db> WHERE <condition>.内表插入(插入多条语句时) SELECT...INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE <itab>FROM <db> WHERE <con…

微服务透传日志traceId

问题 在微服务架构中&#xff0c;一次业务执行完可能需要跨多个服务&#xff0c;这个时候&#xff0c;我们想看到业务完整的日志信息&#xff0c;就要从各个服务中获取&#xff0c;即便是使用了ELK把日志收集到一起&#xff0c;但如果不做处理&#xff0c;也是无法完整把一次业…

Qt中实现高准确率的语音识别

选择语音识别引擎 开源语音识别项目中&#xff0c;以下两款工具可以用于支持中英文识别&#xff0c;并且与Qt兼容&#xff1a; Vosk&#xff1a;Vosk是一个开源的语音识别工具&#xff0c;支持中英文及多种语言&#xff0c;具备离线识别能力&#xff0c;且不依赖互联网。 Padd…

c语言中的线程管理pthread详解

在C语言中,多线程编程常用的POSIX线程(POSIX Threads, pthreads)库主要由pthread.h头文件提供。pthread.h定义了许多用于线程创建、管理、同步的函数和数据结构。下面是pthread.h中的核心概念和主要函数的详细介绍。 1. 基本概念 线程:线程是一个轻量级的进程,可以并发执…

十五:java web(7)-- Spring Boot

目录 1. Spring Boot 简介 1.1 简介 1.2 Spring Boot 的特点 1.3 Spring Boot 和 Spring 的关系 2. Spring Boot 快速入门 2.1 创建第一个 Spring Boot 项目 3. Spring Boot 配置管理 3.1 application.properties 和 application.yml 配置 这两种都可以 好像现在更推荐…

关于打开网页非常慢的解决方法

方法一&#xff1a;刷新dns缓存 ipconfig /flushdns方法二&#xff1a;许多网站&#xff0c;太落后&#xff0c;不支持ipv6&#xff0c;所以关闭ipv6即可

使用Python简单实现客户端界面

服务端实现 import threading import timeimport wx from socket import socket, AF_INET, SOCK_STREAMclass LServer(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, id1002, titleL服务器端界面, poswx.DefaultPosition, size(400, 450))# 窗口中添加面板pl …

JDK1.5 java代码打包jar HmacSha256

文章目录 demo地址背景实现编写代码编译class文件打包 JAR 文件执行生成的 JAR 文件辅助验证方式 常见问题和解决方法常规生成jar方案maven插件idea工具 demo地址 https://github.com/xiangge-zx/HmacSha256 背景 最近接到一个需求,做一个可以用来HmacSha256加密的小工具&am…

ubuntu 22.04 server 安装 xtrabackup 2.4 qpress LTS

ubuntu 22.04 server 安装 xtrabackup 2.4 qpress LTS 参考 https://docs.percona.com/percona-xtrabackup/innovation-release/apt-repo.html https://www.ubuntuupdates.org/ppa/percona_server_with_xtradb?distjammy centos7 xtrabackup mysql&#xff08;8&#xff0…

MySQL 8.0中的‘caching_sha2_password‘身份验证插件问题

使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。 出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是…

Go八股(Ⅳ)***slice,string,defer***

***slice&#xff0c;string&#xff0c;defer*** 1.slice和arry的区别 arry&#xff1a; Go语言中arry即为数据的一种集合&#xff0c;需要在声明时指定容量和初值&#xff0c;且一旦声明就长度固定&#xff0c;访问时按照索引访问。通过内置函数len可以获取数组中的元素个…

雪花算法(Snowflake Algorithm)C# 实现版本

这里采用10位的工作ID,当时间回拔时,采用工作ID增加1来避免生成与旧的ID重复。 雪花算法的结构 雪花算法生成的ID是一个64位的Long型数字,结构如下: 高41位:时间戳(timestamp)中间10位:工作节点ID(workerId),用来避免时间回拔。低12位:序列号(sequence)时间戳(…

服务器虚拟化:构建高效、灵活的数据中心

服务器虚拟化&#xff1a;构建高效、灵活的数据中心 在当今数字化时代&#xff0c;服务器虚拟化已经成为构建高效、灵活数据中心的关键技术。通过服务器虚拟化&#xff0c;企业可以将物理服务器划分为多个虚拟服务器&#xff0c;从而提高资源利用率、降低成本、增强灵活性和提…

2024-11-07 问AI: [AI面试题] 解释推荐系统的概念

文心一言 推荐系统是一种信息过滤系统&#xff0c;旨在预测用户对物品的“评分”或“偏好”&#xff0c;并为用户提供个性化的推荐。以下是关于推荐系统的详细解释&#xff1a; 一、定义与功能 推荐系统通过分析和利用用户的历史行为、偏好和其他信息&#xff0c;来预测用户…

Win系统通过命令行查看笔记本电池损耗/寿命/健康

在 Windows 10/11 系统中&#xff0c;可以通过指令查看笔记本电池的寿命情况&#xff0c;方法如下&#xff1a; 0&#xff0c;打开cmd/终端 键盘快捷键&#xff1a;Win R&#xff0c;然后输入cmd&#xff0c;点击【确定】 1&#xff0c;执行命令 在命令行中输入下面指令并按…