使用 Node.js 和 Express 创建 RESTful API 的分步指南,包括 CRUD 操作和身份验证
目录
介绍
欢迎来到使用 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 服务器的开发环境,您需要遵循以下步骤:
-
如果还没有,请从官方网站下载并安装Node.js。
-
打开一个新的终端或命令提示符窗口并导航到您想要创建服务器端 Web 应用程序的目录。
-
通过运行命令为您的应用程序创建一个新目录
mkdir my-express-server
(您可以将“my-express-server”替换为您选择的任何名称)。 -
通过运行命令进入新创建的目录
cd my-express-server
。 -
通过运行命令初始化一个新的 Node.js 项目
npm init
。这将创建一个 package.json 文件来存储项目依赖项和其他相关信息。 -
通过运行命令 npm install express 将 Express 安装为依赖项。
完成这些步骤后,您可以继续server.js
在项目根目录中创建一个名为的新文件并开始构建 Express 服务器。
创建基本 Express 服务器
首先,让我们通过运行命令 为我们的 Express 服务器创建一个入口文件touch server.js
。该文件将作为我们应用程序的起点。您可以随意命名它,但为了简单起见,我们将使用常规名称server.js
。
在文件中server.js
,我们首先导入必要的模块并创建 Express 应用程序的实例。操作如下:
const express = require('express');
const app = express();
太棒了!现在我们已经设置好了 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}`);
});
server.js
只需在文件末尾添加以下代码即可添加一条主路由以进行测试
// Define a route to handle incoming requests
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
最终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!');
});
要启动新创建的 express 服务器,请运行以下命令:node app.js
您的 Express 服务器现在应该已运行,您可以通过打开 Web 浏览器并访问http://localhost:3000(或您指定的端口)来访问它。您应该会在浏览器中看到“Hello, Express!”。
恭喜!您已成功创建基本的 Express 服务器并开始运行。就这么简单!在接下来的部分中,我们将探索如何实现 CRUD 操作以及如何为 API 添加身份验证。精彩内容就在前方!敬请期待更多精彩内容。
实现 CRUD 操作
要在 Express.js 服务器中创建 CRUD(创建、读取、更新、删除)操作,您可以扩展现有代码。操作方法如下:
- 添加数据存储
在此示例中,我们创建一个简单的内存数据存储来保存一些数据。在生产应用程序中,您可以将其替换为真正的数据库,例如 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' },
];
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]);
}
});
在此代码中:
-
我们使用 Express 中间件(express.json())来解析 JSON 请求。
-
我们为每个 CRUD 操作定义路由,指定 HTTP 方法(例如,POST、GET、PUT、DELETE)和路由路径(例如,/items)。
-
在每个路由处理程序内部,我们对数据数组执行相应的 CRUD 操作并发送 JSON 响应。
3.启动你的Express服务器
像以前一样启动您的 Express 服务器:
node server.js
如果服务器已在运行,请尝试按以下方式关闭第一个服务器:CTRL + c
现在,您可以使用 Postman 或 curl 等工具来测试您的 CRUD 操作。以下是一些示例请求:
- 创建(发布)一个新项目:
POST http://localhost:3000/items
Body: { "name": "New Item" }
- 读取(GET)所有项目:您可以使用 postman 或 curl 或浏览器进行获取请求
GET http://localhost:3000/items
- 通过 ID 读取(GET)特定项目:
GET http://localhost:3000/items/1
- 通过 ID 更新(PUT)项目:
PUT http://localhost:3000/items/1
Body: { "name": "Updated Item" }
- 通过 ID 删除(DELETE)一个项目:
DELETE http://localhost:3000/items/1
请记住,这是一个使用内存数据存储的简单示例。在实际应用中,您可能会使用数据库来实现更强大的数据存储和管理。
向 API 添加身份验证
为 API 添加身份验证是确保其安全的重要步骤。Express.js 提供了多种身份验证方法。下文将指导您使用 JSON Web Tokens (JWT) 添加基于令牌的基本身份验证。这只是实现身份验证的一种方法;在生产环境中,您可能需要考虑更高级的技术和库。
- 安装依赖项
首先,你需要安装 JWT 身份验证和密码哈希所需的软件包。你可以使用 jsonwebtoken 和 bcrypt 来实现:
npm install jsonwebtoken bcrypt
2.导入依赖项
在您的server.js
文件中,在端口部分之后的顶部导入这些依赖项:
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
3. 创建密钥
生成用于 JWT 令牌签名的密钥。您应该将其安全地存储,最好存储在实际应用程序中的环境变量中。
const secretKey = 'your-secret-key'; // Replace with a strong, secret key
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
}
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 });
});
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 });
});
在此示例中,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