Node.js 全栈开发进阶篇

devtools/2024/11/8 19:29:43/

​🌈个人主页:前端青山
🔥系列专栏: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.ppmy.cn/devtools/132381.html

相关文章

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考:5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 RabbitMQ 初识 1.1 RabbitMQ 安装 2.0 数据隔离 2.1 用户管理 2.2 virtual host 虚拟主机 3.0 SpringAMQP 3.1 RabbitMQ 配置 3.2 发送消息 3.3 接收消息 3.4 Wor…

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速 2024/11/2 14:18 客户端:荣耀手机HONOR 70【iPerf2 for Android】 服务器端:荣品PRO-RK3566开发板 预编译固件:update-pro-rk3566-buildroot-hdmi-2…

图论导引 - 第二章 - 11/08

图论导引 - 第二章 - 11/08 第二章:定义与示例 Definitions and examples 章节概述 在这一章中,我们为图论的深入研究奠定基础。第2节将第1章中的一些基本定义形式化,第3节提供了各种示例。在第4节中,我们展示如何用图来表示并…

SpringBoot整合Freemarker(二)

if分支 语法&#xff1a; <#if condition>... <#elseif condition2>... <#elseif condition3>... <#else>... </#if> 例子&#xff1a; <#if x 1>x is 1 </#if> --------------------------------- <#if x 1>x is 1 <…

大数据-205 数据挖掘 机器学习理论 - 线性回归 最小二乘法 多元线性

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

jmeter里判断返回参数是否为空

用jmeter做接口自动化&#xff0c;怎么判断返回的参数是否为空 我们假如返回的参数是数组&#xff0c;有以下3个方向来判断 1、断言返回的字段为大于0的正整数 [1-9][0-9]* 2、返回data的数组长度 data_marchNr 表示数组长度 String datavars.get(“data_matchNr”); int tota…

领略CSS Flex布局的精髓:打造响应式与创新设计

引言 Flexbox 或弹性盒子布局&#xff0c;是 CSS 中的一项革命性特性&#xff0c;旨在简化复杂的多列布局和响应式设计过程。相比传统的 float 和 positioning 方法&#xff0c;Flexbox 提供更直观且强大的布局控制能力&#xff0c;尤其适用于现代网站的复杂结构。本文将深入解…