一、为什么选择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功能!

小夜