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

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

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

相关推荐
航月几秒前
yum配置,文件,命令详解
linux
浪里个浪的10241 分钟前
【C#】第6章:用户界面设计 课后习题
开发语言·c#·用户界面
yudas7 分钟前
arm 汇编技巧
linux
有点困的拿铁11 分钟前
Java中的享元模式
java·开发语言·享元模式
破浪前行·吴19 分钟前
使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件
前端·react.js·three.js
随心............22 分钟前
python设计模式
java·开发语言·设计模式
零炻大礼包32 分钟前
【Node-Red】使用文件或相机拍摄实现图像识别
图像处理·node.js
A_cot37 分钟前
Vue.js:构建现代 Web 应用的强大框架
前端·javascript·vue.js·flutter·html·web·js
Kousi40 分钟前
AlphabetIndexer组件,鸿蒙开发
前端·javascript·harmonyos