Node.js 全栈开发进阶篇

​🌈个人主页:前端青山

🔥系列专栏:node.js篇

🔖人终将被年少不可得之物困其一生

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

前言

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

目录

前言

二、路由管理

[2.1 什么是路由?](#2.1 什么是路由?)

[2.2 安装 Express](#2.2 安装 Express)

[2.3 创建路由](#2.3 创建路由)

[2.4 代码解释](#2.4 代码解释)

三、中间件

[3.1 什么是中间件?](#3.1 什么是中间件?)

[3.2 日志中间件](#3.2 日志中间件)

[3.3 代码解释](#3.3 代码解释)

四、错误处理

[4.1 错误处理中间件](#4.1 错误处理中间件)

[4.2 代码解释](#4.2 代码解释)

五、安全性

[5.1 使用 Helmet](#5.1 使用 Helmet)

[5.2 配置 Helmet](#5.2 配置 Helmet)

[5.3 代码解释](#5.3 代码解释)

六、总结

二、路由管理

2.1 什么是路由?

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

2.2 安装 Express

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

bash 复制代码
npm install express

2.3 创建路由

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

javascript 复制代码
// 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 日志中间件

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

javascript 复制代码
// 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 错误处理中间件

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

javascript 复制代码
// 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:

bash 复制代码
npm install helmet

5.2 配置 Helmet

在 index.js 文件中配置 Helmet:

javascript 复制代码
// 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 的技能,构建更加健壮和安全的全栈应用。

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

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

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
未济4 天前
linux 配置环境变量
linux
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js