使

使用 Node.js 和 Express 创建 RESTful API 的分步指南,包括 CRUD 操作和身份验证

2025-06-07

使用 Node.js 和 Express 创建 RESTful API 的分步指南,包括 CRUD 操作和身份验证

目录

  1. 介绍

  2. 什么是 Restful API?

  3. 为什么选择 Node.js 和 Express?

  4. 设置开发环境

  5. 创建基本 Express 服务器

  6. 实现 CRUD 操作

  7. 向 API 添加身份验证

  8. 结论


介绍

欢迎来到使用 Node.js 和 Express 创建 RESTful API 的奇妙世界!在本指南中,我们将逐步指导您构建您自己的 API,并附带所有必要的功能。

但在深入探讨细节之前,我们先来了解一下 Restful API 究竟是什么。别担心,我们不会用专业术语来烦你。简而言之,Restful API 允许不同的应用程序无缝地相互通信,就像一场精心编排的舞蹈。

现在,您可能想知道为什么我们选择 Node.js 和 Express 来进行这次探索。好吧,做好准备,因为 Node.js 是基于 Chrome V8 引擎构建的 JavaScript 运行时,速度极快。那么 Express 呢?它是一个极简且灵活的 Web 应用程序框架,能够充分发挥 Node.js 的优势。

那么,让我们系好安全带,搭建开发环境,踏上这段激动人心的旅程吧!我们保证,这一切都值得。


什么是 RESTful API?

RESTful API 是一种 Web 服务,允许不同的计算机系统通过互联网相互通信。我们所说的“RESTful”是指它遵循一套关于如何进行通信的规则。

可以将其视为两台计算机或应用程序通过通用语言(例如英语或西班牙语)相互通信的一种方式。但它们使用的不是文字,而是称为“请求”和“响应”的特定消息,例如检索数据或代表对方采取行动。

这些请求和响应通常使用标准化格式发送,例如 JSON 或 XML。这样,即使不同的系统是由不同的人员或公司构建的,它们也可以相互理解并协同工作。


为什么选择 Node.js 和 Express?

Node.js并且Express是创建 RESTful API 的热门选择,原因如下。首先,Node.js 基于 Chrome 的 V8 JavaScript 引擎构建,该引擎提供了充足的性能和可扩展性。它允许开发人员使用 JavaScript(一种在客户端广泛使用的语言)构建服务器端应用程序,从而更易于共享代码并缩短开发时间。

Express 则是一个基于 Node.js 构建的轻量级框架。它提供了一种简单直观的方式来创建 Web 应用程序和 API。Express 提供了丰富的功能和中间件,使其高度灵活且可定制,以满足不同的项目需求。

Node.js 和 Express 的主要优势之一是其非阻塞、事件驱动的架构。这意味着它们可以高效处理大量并发请求,是构建高性能 API 的理想选择。

此外,Node.js 拥有蓬勃发展的生态系统,其中包含大量开源库和模块,为开发人员提供广泛的工具和资源。

此外,Express 提供了一种简洁且结构化的方式来处理路由,允许开发人员定义各种端点及其对应的 HTTP 方法。它还支持中间件,可以轻松实现身份验证、请求验证和错误处理等功能。


设置开发环境

现在,您已经准备好使用 Node.js 和 Express 创建 Restful API 了!但在开始编写代码之前,我们需要先设置一下开发环境。别担心,其实并没有听起来那么复杂。

要设置用于创建基本 Express 服务器的开发环境,您需要遵循以下步骤:

  1. 如果还没有,请从官方网站下载并安装Node.js。

  2. 打开一个新的终端或命令提示符窗口并导航到您想要创建服务器端 Web 应用程序的目录。

  3. 通过运行命令为您的应用程序创建一个新目录mkdir my-express-server(您可以将“my-express-server”替换为您选择的任何名称)。

  4. 通过运行命令进入新创建的目录cd my-express-server

  5. 通过运行命令初始化一个新的 Node.js 项目npm init。这将创建一个 package.json 文件来存储项目依赖项和其他相关信息。

  6. 通过运行命令 npm install express 将 Express 安装为依赖项。

完成这些步骤后,您可以继续server.js在项目根目录中创建一个名为的新文件并开始构建 Express 服务器。


创建基本 Express 服务器

首先,让我们通过运行命令 为我们的 Express 服务器创建一个入口文件touch server.js。该文件将作为我们应用程序的起点。您可以随意命名它,但为了简单起见,我们将使用常规名称server.js

在文件中server.js,我们首先导入必要的模块并创建 Express 应用程序的实例。操作如下:

const express = require('express');
const app = express();
Enter fullscreen mode Exit fullscreen mode

太棒了!现在我们已经设置好了 Express 服务器,接下来需要指定它监听的端口。只需添加以下代码即可:

const port = process.env.PORT || 3000; // Use the port provided by the host or default to 3000
app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});
Enter fullscreen mode Exit fullscreen mode

server.js只需在文件末尾添加以下代码即可添加一条主路由以进行测试

 // Define a route to handle incoming requests
app.get('/', (req, res) => {
  res.send('Hello, Express!');
});
Enter fullscreen mode Exit fullscreen mode

最终server.js文件:

const express = require('express');
const app = express();

const port = process.env.PORT || 3000; // Use the port provided by the host or default to 3000
app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

// Define a route to handle incoming requests
app.get('/', (req, res) => {
  res.send('Hello, Express!');
});
Enter fullscreen mode Exit fullscreen mode

要启动新创建的 express 服务器,请运行以下命令:
node app.js

您的 Express 服务器现在应该已运行,您可以通过打开 Web 浏览器并访问http://localhost:3000(或您指定的端口)来访问它。您应该会在浏览器中看到“Hello, Express!”。

恭喜!您已成功创建基本的 Express 服务器并开始运行。就这么简单!在接下来的部分中,我们将探索如何实现 CRUD 操作以及如何为 API 添加身份验证。精彩内容就在前方!敬请期待更多精彩内容。


实现 CRUD 操作

要在 Express.js 服务器中创建 CRUD(创建、读取、更新、删除)操作,您可以扩展现有代码。操作方法如下:

  1. 添加数据存储

在此示例中,我们创建一个简单的内存数据存储来保存一些数据。在生产应用程序中,您可以将其替换为真正的数据库,例如 MongoDB 或 PostgreSQL。在server.js文件中添加以下代码:

// In-memory data store (replace with a database in production)
const data = [
  { id: 1, name: 'Item 1' },
  { id: 2, name: 'Item 2' },
  { id: 3, name: 'Item 3' },
];
Enter fullscreen mode Exit fullscreen mode

2. 为 CRUD 操作创建路由

现在,为每个 CRUD 操作创建路由:

  • 创建(POST):向数据存储添加新项目。

  • 读取(GET):通过 ID 检索项目列表或特定项目。

  • 更新(PUT):通过 ID 更新现有项目。

  • 删除(DELETE):通过ID删除一个项目。

在数据存储定义后添加以下代码:

// Middleware to parse JSON requests
app.use(express.json());

// Create (POST) a new item
app.post('/items', (req, res) => {
  const newItem = req.body;
  data.push(newItem);
  res.status(201).json(newItem);
});

// Read (GET) all items
app.get('/items', (req, res) => {
  res.json(data);
});

// Read (GET) a specific item by ID
app.get('/items/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const item = data.find((item) => item.id === id);
  if (!item) {
    res.status(404).json({ error: 'Item not found' });
  } else {
    res.json(item);
  }
});

// Update (PUT) an item by ID
app.put('/items/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const updatedItem = req.body;
  const index = data.findIndex((item) => item.id === id);
  if (index === -1) {
    res.status(404).json({ error: 'Item not found' });
  } else {
    data[index] = { ...data[index], ...updatedItem };
    res.json(data[index]);
  }
});

// Delete (DELETE) an item by ID
app.delete('/items/:id', (req, res) => {
      const id = parseInt(req.params.id);
      const index = data.findIndex((item) => item.id === id);
      if (index === -1) {
        res.status(404).json({ error: 'Item not found' });
      } else {
        const deletedItem = data.splice(index, 1);
        res.json(deletedItem[0]);
      }
});
Enter fullscreen mode Exit fullscreen mode

在此代码中:

  • 我们使用 Express 中间件(express.json())来解析 JSON 请求。

  • 我们为每个 CRUD 操作定义路由,指定 HTTP 方法(例如,POST、GET、PUT、DELETE)和路由路径(例如,/items)。

  • 在每个路由处理程序内部,我们对数据数组执行相应的 CRUD 操作并发送 JSON 响应。

3.启动你的Express服务器

像以前一样启动您的 Express 服务器:

node server.js
Enter fullscreen mode Exit fullscreen mode

如果服务器已在运行,请尝试按以下方式关闭第一个服务器:CTRL + c

现在,您可以使用 Postman 或 curl 等工具来测试您的 CRUD 操作。以下是一些示例请求:

  • 创建(发布)一个新项目:
POST http://localhost:3000/items
Body: { "name": "New Item" }
Enter fullscreen mode Exit fullscreen mode
  • 读取(GET)所有项目:您可以使用 postman 或 curl 或浏览器进行获取请求
GET http://localhost:3000/items
Enter fullscreen mode Exit fullscreen mode
  • 通过 ID 读取(GET)特定项目:
GET http://localhost:3000/items/1

Enter fullscreen mode Exit fullscreen mode
  • 通过 ID 更新(PUT)项目:
PUT http://localhost:3000/items/1
Body: { "name": "Updated Item" }
Enter fullscreen mode Exit fullscreen mode
  • 通过 ID 删除(DELETE)一个项目:
DELETE http://localhost:3000/items/1
Enter fullscreen mode Exit fullscreen mode

请记住,这是一个使用内存数据存储的简单示例。在实际应用中,您可能会使用数据库来实现更强大的数据存储和管理。


向 API 添加身份验证

为 API 添加身份验证是确保其安全的重要步骤。Express.js 提供了多种身份验证方法。下文将指导您使用 JSON Web Tokens (JWT) 添加基于令牌的基本身份验证。这只是实现身份验证的一种方法;在生产环境中,您可能需要考虑更高级的技术和库。

  1. 安装依赖项

首先,你需要安装 JWT 身份验证和密码哈希所需的软件包。你可以使用 jsonwebtoken 和 bcrypt 来实现:

npm install jsonwebtoken bcrypt
Enter fullscreen mode Exit fullscreen mode

2.导入依赖项

在您的server.js文件中,在端口部分之后的顶部导入这些依赖项:

const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
Enter fullscreen mode Exit fullscreen mode

3. 创建密钥

生成用于 JWT 令牌签名的密钥。您应该将其安全地存储,最好存储在实际应用程序中的环境变量中。

const secretKey = 'your-secret-key'; // Replace with a strong, secret key
Enter fullscreen mode Exit fullscreen mode

4. 用户数据和身份验证逻辑

在此示例中,我们假设一个包含用户名和哈希密码的简单用户数据库。在实际应用中,您将使用 MongoDB 或 PostgreSQL 之类的数据库来存储用户信息。这是一个简化的示例,请在文件末尾添加以下代码server.js

// Sample user data (replace with a real database)
const users = [
  { id: 1, username: 'user1', password: '$2b$10$kgix/7wKMGMmqJYixdfvfugaj5W/iHKcjArX2H76DVIZmQzXr7/hJ' }, // Hashed password: "password1"
  { id: 2, username: 'user2', password: '$2b$10$kgix/7wKMGMmqJYixdfvfugaj5W/iHKcjArX2H76DVIZmQzXr7/hJ' }, // Hashed password: "password2"
];

// Function to verify user credentials
function authenticateUser(username, password) {
  const user = users.find((user) => user.username === username);
  if (!user) {
     return null; // User not found
  }
  if (bcrypt.compareSync(password, user.password)) {
    return user; // Password is correct
  }
  return null; // Password is incorrect
}
Enter fullscreen mode Exit fullscreen mode

5.创建身份验证路由

定义一个身份验证路由,用户可以登录,如果凭据正确,则可以接收 JWT 令牌。在文件末尾添加以下代码server.js

app.post('/auth/login', (req, res) => {
  const { username, password } = req.body;
  const user = authenticateUser(username, password);

  if (!user) {
    return res.status(401).json({ error: 'Authentication failed' });
  }

  const token = jwt.sign({ userId: user.id, username: user.username }, secretKey, {
        expiresIn: '1h', // Token expiration time
  });

  res.json({ token });
});
Enter fullscreen mode Exit fullscreen mode

6. 使用身份验证中间件实现安全路由

为了保护需要身份验证的路由,您可以创建一个中间件函数来检查请求标头中的 JWT 令牌。

function authenticateToken(req, res, next) {
  const token = req.header('Authorization');

  if (!token) {
    return res.status(401).json({ error: 'Authentication token missing' });
  }

  jwt.verify(token, secretKey, (err, user) => {
    if (err) {
      return res.status(403).json({ error: 'Token is invalid'});
    }
    req.user = user;
    next(); // Continue to the protected route
  });
}

// Example usage:
app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: 'This is a protected route', user: req.user });
});

Enter fullscreen mode Exit fullscreen mode

在此示例中,authenticateToken 中间件检查 Authorization 标头中是否包含有效的 JWT 令牌。如果有效,它将用户信息附加到请求对象 (req.user),并允许访问受保护的路由。否则,它将返回错误响应。

现在,您的 Express.js API 中已经有了一个基于令牌的基本身份验证系统。用户可以登录并接收 JWT 令牌,并且您可以通过向特定路由添加 authenticToken 中间件来保护它们。


结论

至此,我们使用 Node.js 和 Express 创建 Restful API 的旅程圆满结束,其中包括 CRUD 操作和身份验证。让我们快速回顾一下目前为止讲到的要点。

首先,我们探讨了什么是 Restful API,以及为什么 Node.js 和 Express 是构建 Restful API 的绝佳选择。然后,我们深入搭建了开发环境,这是我们 API 的基础。

接下来,我们创建了一个基本的 Express 服务器,按照分步指南进行操作,包括安装 Express、创建新的项目目录、使用 package.json 文件初始化项目、安装依赖项、创建入口点文件以及最后设置 Express 服务器本身。

之后,我们通过添加数据存储、设置 API 路由以及编写创建、读取、更新和删除数据的操作来实现 CRUD 操作。

最后,我们通过安装必要的包、创建受保护的路由、设置身份验证中间件以及保护我们的 API 端点,为我们的 API 添加了身份验证。

🔗 通过以下方式与我联系:

非常感谢!🌟

  • 读者:感谢你的每一次点击和阅读。
  • 参与者:鼓掌、评论、分享——你是最棒的!
  • 关注者:很荣幸得到您一直以来的支持。
  • 沉默的仰慕者:你的存在不会被忽视。
  • 建设性批评:您的见解有助于我们改进。

💌保持联系并感谢您成为我们旅程的一部分。

文章来源:https://dev.to/jaimaldullat/a-step-by-step-guide-to-creating-a-restful-api-using-nodejs-and-express-include-crud-operations-and-authentication-2mo2
PREV
.NET Core 依赖注入:你应该知道的一切 TLDR;我从构建 Coravel 中学到的东西:第三部分 什么是依赖注入?为什么我们应该将依赖项作为参数传递?什么是依赖注入(重温) 快速了解测试 快速了解模块化 避免类继承 在 .NET Core 中使用依赖注入 真实示例 真实测试 你应该了解的关于使用 .NET Core 依赖注入的知识 结论 导航你的软件开发职业通讯
NEXT
如何在 CSS 中将任何内容居中