一、为什么选择Node.js构建API?¶
Node.js是基于Chrome V8引擎的JavaScript运行环境,它的非阻塞I/O和单线程模型使其特别适合构建高并发的网络服务。对于RESTful API(一种遵循REST风格的API设计规范),Node.js配合轻量级框架如Express,可以快速实现简单高效的后端服务,非常适合初学者入门。
二、准备工作:安装Node.js和Express¶
首先确保你的电脑已安装Node.js(推荐LTS版本),可以通过nodejs官网下载安装。安装完成后,打开终端执行以下命令验证:
node -v # 显示Node.js版本号
npm -v # 显示npm版本号
接下来,创建一个项目文件夹并初始化:
mkdir node-api-demo
cd node-api-demo
npm init -y # 快速生成package.json文件
安装Express框架(我们将用它处理路由和响应):
npm install express
三、Express基础:创建第一个路由¶
Express是一个简洁的Web框架,核心功能是处理HTTP请求和返回响应。创建一个app.js文件,编写以下代码:
// 引入Express模块
const express = require('express');
// 创建Express应用实例
const app = express();
// 定义端口号(可自定义,如3000)
const PORT = 3000;
// 使用中间件:解析JSON格式的请求体(必须在路由定义前调用)
app.use(express.json());
// 定义路由:处理GET请求(获取资源)
app.get('/', (req, res) => {
// req: 请求对象,包含请求信息(如参数、头信息等)
// res: 响应对象,用于返回数据给客户端
res.status(200).json({
message: '欢迎使用Node.js RESTful API',
version: '1.0.0'
});
});
// 启动服务器
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
代码解释:
- app.get():处理GET请求,第一个参数是请求路径('/'表示根路径),第二个参数是回调函数,接收req(请求)和res(响应)对象。
- res.status(200):设置HTTP状态码为200(表示请求成功),res.json():返回JSON格式数据(比res.send()更规范,适合API)。
- express.json():中间件,用于解析客户端发送的JSON格式请求体(如POST/PUT请求)。
四、处理不同HTTP方法¶
RESTful API通过不同HTTP方法表达不同操作,常见的有GET(获取)、POST(创建)、PUT(更新)、DELETE(删除)。我们继续在app.js中添加示例路由:
1. GET请求:获取资源¶
// 模拟用户数据(实际项目中可连接数据库)
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
// 获取所有用户
app.get('/users', (req, res) => {
res.status(200).json({
success: true,
data: users
});
});
// 获取单个用户(通过路由参数)
app.get('/users/:id', (req, res) => {
const userId = parseInt(req.params.id); // 将参数转为数字
const user = users.find(u => u.id === userId);
if (user) {
res.status(200).json({ success: true, data: user });
} else {
res.status(404).json({ success: false, message: '用户不存在' });
}
});
路由参数:/users/:id中的:id是动态参数,通过req.params.id获取,可用于获取单个资源(如用户ID)。
2. POST请求:创建资源¶
// 创建新用户(需解析请求体,已通过express.json()中间件实现)
app.post('/users', (req, res) => {
const newUser = {
id: users.length + 1, // 简单生成ID
name: req.body.name, // 从请求体获取name参数
age: req.body.age
};
// 验证请求体是否包含必要参数
if (!newUser.name || !newUser.age) {
return res.status(400).json({
success: false,
message: 'name和age为必填参数'
});
}
users.push(newUser);
res.status(201).json({ // 201表示“创建成功”
success: true,
data: newUser
});
});
注意:POST请求需客户端发送JSON数据(如{ "name": "Charlie", "age": 28 }),并通过req.body获取数据。
3. PUT请求:更新资源¶
// 更新用户信息
app.put('/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const index = users.findIndex(u => u.id === userId);
if (index === -1) {
return res.status(404).json({ success: false, message: '用户不存在' });
}
// 更新用户信息(合并请求体参数到原用户数据)
users[index] = { ...users[index], ...req.body };
res.status(200).json({ success: true, data: users[index] });
});
4. DELETE请求:删除资源¶
// 删除用户
app.delete('/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const initialLength = users.length;
// 过滤掉指定ID的用户
const newUsers = users.filter(u => u.id !== userId);
if (newUsers.length === initialLength) {
return res.status(404).json({ success: false, message: '用户不存在' });
}
// 更新用户列表
users.length = 0;
users.push(...newUsers);
res.status(200).json({ success: true, message: '用户已删除' });
});
五、处理404和通用响应¶
当客户端请求不存在的路径时,Express默认不会返回404,需要手动处理:
// 404处理:所有未匹配路由都会进入此处
app.use((req, res) => {
res.status(404).json({ success: false, message: `路径 ${req.originalUrl} 不存在` });
});
六、路由模块化(进阶)¶
当项目规模增大时,路由会越来越多,建议按功能拆分到不同文件(如routes/users.js),主文件引入:
1. 创建路由文件 routes/users.js:
const express = require('express');
const router = express.Router(); // 创建路由实例
// 这里写/users相关路由(与前面app.js中的/users路由一致)
router.get('/', (req, res) => { /* ... */ });
router.post('/', (req, res) => { /* ... */ });
module.exports = router;
2. 在主文件 app.js 中引入:
const userRoutes = require('./routes/users');
app.use('/users', userRoutes); // 将/users路径与路由文件关联
七、测试你的API¶
启动服务器:
node app.js
使用工具测试API(推荐Postman或curl):
- GET /:访问 http://localhost:3000,查看欢迎信息。
- GET /users:获取用户列表。
- POST /users:发送JSON请求体({ "name": "Charlie", "age": 28 }),创建新用户。
- GET /users/1:获取ID为1的用户信息。
总结¶
通过本文,你已经掌握了Node.js构建RESTful API的核心技能:
1. 使用Express框架快速创建服务
2. 定义不同HTTP方法的路由(GET/POST/PUT/DELETE)
3. 处理请求参数(路径参数、请求体)和返回响应
4. 处理错误状态码(404、400等)和响应内容
5. 路由模块化设计(进阶)
接下来可以尝试连接数据库(如MongoDB、MySQL),将模拟数据替换为真实数据,逐步完善你的API功能!