使用Node.js构建REST API(Express框架)
本教程将带你从零开始构建一个完整的RESTful API,使用Node.js和Express框架。你将学习如何创建路由、实现CRUD操作、处理错误、进行身份验证和测试。
什么是REST API?
REST(Representational State Transfer)是一种架构风格,用于设计网络应用程序。RESTful API遵循REST原则,使用HTTP方法(GET、POST、PUT、DELETE)来操作资源。
REST API的特点
- 无状态:每个请求都包含处理该请求所需的所有信息
- 统一接口:使用标准的HTTP方法
- 资源导向:URL表示资源,HTTP方法表示操作
- 可缓存:响应可以被缓存以提高性能
项目设置
1. 初始化项目
# 创建项目目录
mkdir nodejs-rest-api
cd nodejs-rest-api
# 初始化package.json
npm init -y
# 安装依赖
npm install express cors helmet morgan dotenv
npm install -D nodemon
2. 项目结构
nodejs-rest-api/
├── src/
│ ├── controllers/
│ │ └── userController.js
│ ├── middleware/
│ │ ├── auth.js
│ │ └── errorHandler.js
│ ├── models/
│ │ └── User.js
│ ├── routes/
│ │ └── userRoutes.js
│ ├── services/
│ │ └── userService.js
│ └── app.js
├── tests/
│ └── user.test.js
├── .env
├── .gitignore
└── package.json
基础Express应用
1. 创建主应用文件
// src/app.js
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
require('dotenv').config();
const app = express();
const PORT = process.env.PORT || 3000;
// 中间件
app.use(helmet()); // 安全头
app.use(cors()); // 跨域支持
app.use(morgan('combined')); // 日志记录
app.use(express.json()); // JSON解析
app.use(express.urlencoded({ extended: true })); // URL编码解析
// 路由
app.get('/', (req, res) => {
res.json({
message: 'Welcome to Node.js REST API',
version: '1.0.0',
endpoints: {
users: '/api/users',
health: '/api/health'
}
});
});
// 健康检查端点
app.get('/api/health', (req, res) => {
res.json({
status: 'OK',
timestamp: new Date().toISOString(),
uptime: process.uptime()
});
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
error: 'Something went wrong!',
message: process.env.NODE_ENV === 'development' ? err.message : 'Internal Server Error'
});
});
// 404处理
app.use('*', (req, res) => {
res.status(404).json({
error: 'Route not found',
message: `Cannot ${req.method} ${req.originalUrl}`
});
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
module.exports = app;