appointment_system/backend/RESPONSE_FORMAT.md
2025-12-11 22:50:18 +08:00

340 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# API 响应格式说明
## 统一响应格式
所有 API 接口现在都返回统一的格式:
```json
{
"code": 0,
"message": "Success",
"data": {}
}
```
## 字段说明
### code (Number)
- **0**: 成功
- **400**: 请求参数错误
- **401**: 未授权/Token 无效
- **403**: 禁止访问
- **404**: 资源不找到
- **409**: 冲突(如重复数据)
- **500**: 服务器内部错误
### message (String)
- 操作结果的描述信息
- 成功时通常为 "Success" 或具体的成功消息
- 失败时为错误描述
### data (Object | Array | null)
- 成功时包含返回的数据
- 失败时为 null
## 响应示例
### 成功响应
#### 1. 登录成功
```json
{
"code": 0,
"message": "Login successful",
"data": {
"user": {
"id": "uuid",
"nickname": "用户昵称",
"avatar": "https://...",
"language": "zh",
"balance": 0.00
},
"token": "Bearer eyJhbGc...",
"refreshToken": "eyJhbGc..."
}
}
```
#### 2. 获取列表
```json
{
"code": 0,
"message": "Success",
"data": {
"items": [
{ "id": 1, "name": "Item 1" },
{ "id": 2, "name": "Item 2" }
],
"pagination": {
"total": 100,
"page": 1,
"limit": 10,
"totalPages": 10
}
}
}
```
#### 3. 创建资源
```json
{
"code": 0,
"message": "Created successfully",
"data": {
"id": "uuid",
"name": "New Item",
"createdAt": "2025-12-05T12:00:00Z"
}
}
```
#### 4. 删除资源
```json
{
"code": 0,
"message": "Deleted successfully",
"data": null
}
```
### 错误响应
#### 1. 参数验证错误 (400)
```json
{
"code": 400,
"message": "Invalid input data",
"data": null,
"errors": [
{
"field": "email",
"message": "Email is required"
}
]
}
```
#### 2. 未授权 (401)
```json
{
"code": 401,
"message": "Invalid or expired token",
"data": null
}
```
#### 3. 禁止访问 (403)
```json
{
"code": 403,
"message": "Insufficient permissions",
"data": null
}
```
#### 4. 资源不存在 (404)
```json
{
"code": 404,
"message": "Resource not found",
"data": null
}
```
#### 5. 服务器错误 (500)
```json
{
"code": 500,
"message": "Internal server error",
"data": null
}
```
## 实现方式
### 方式 1: 使用响应工具函数
```javascript
const { sendSuccess, sendError, sendPaginated } = require('../utils/response');
// 成功响应
sendSuccess(res, data, 'Operation successful');
// 错误响应
sendError(res, 'Error message', 400, 400);
// 分页响应
sendPaginated(res, items, total, page, limit, 'Success');
```
### 方式 2: 自动转换(推荐)
系统已配置响应格式化中间件,会自动转换所有响应:
```javascript
// 旧格式(会自动转换)
res.json({
success: true,
data: { ... }
});
// 自动转换为
{
code: 0,
message: "Success",
data: { ... }
}
```
## 前端使用
### 判断请求是否成功
```javascript
const response = await api.login(code);
// 方式 1: 判断 code
if (response.code === 0) {
// 成功
console.log(response.data);
} else {
// 失败
console.error(response.message);
}
// 方式 2: 兼容旧格式
const isSuccess = (response.code === 0) || (response.success === true);
if (isSuccess) {
// 成功
}
```
### 错误处理
```javascript
try {
const response = await api.someRequest();
if (response.code !== 0) {
// 显示错误消息
uni.showToast({
title: response.message,
icon: 'none'
});
return;
}
// 处理成功数据
const data = response.data;
} catch (error) {
console.error('Request failed:', error);
}
```
## 迁移指南
### 从旧格式迁移
如果你的代码使用旧格式 `{ success: true, data: {} }`
#### 1. 更新判断逻辑
```javascript
// 旧代码
if (data.success) {
// ...
}
// 新代码
if (data.code === 0) {
// ...
}
// 或兼容两种格式
if (data.code === 0 || data.success === true) {
// ...
}
```
#### 2. 更新错误处理
```javascript
// 旧代码
if (!data.success) {
console.error(data.error.message);
}
// 新代码
if (data.code !== 0) {
console.error(data.message);
}
```
#### 3. 更新数据访问
```javascript
// 数据访问方式不变
const user = data.data.user;
const items = data.data.items;
```
## 注意事项
1. **code 为 0 表示成功**,其他值表示失败
2. **message** 字段始终存在,包含操作结果描述
3. **data** 字段在失败时为 null
4. 开发环境下,错误响应可能包含额外的 **error** 字段用于调试
5. HTTP 状态码与 code 字段可能不同,建议以 code 字段为准
## 相关文件
- `backend/src/middleware/responseFormatter.js` - 响应格式化中间件
- `backend/src/utils/response.js` - 响应工具函数
- `backend/src/middleware/errorHandler.js` - 错误处理中间件
## 测试
### 测试成功响应
```bash
curl http://localhost:3000/api/v1/categories
# 期望输出
{
"code": 0,
"message": "Success",
"data": [...]
}
```
### 测试错误响应
```bash
curl http://localhost:3000/api/v1/services/invalid-id
# 期望输出
{
"code": 404,
"message": "Service not found",
"data": null
}
```
## 常见问题
### Q: 为什么要统一响应格式?
A: 统一的响应格式让前端更容易处理 API 响应,减少判断逻辑,提高代码可维护性。
### Q: code 和 HTTP 状态码有什么区别?
A: HTTP 状态码是传输层的状态code 是业务层的状态。建议前端主要使用 code 判断业务成功与否。
### Q: 如何处理分页数据?
A: 分页数据包含在 data 对象中,包括 items 数组和 pagination 对象。
### Q: 旧代码会自动转换吗?
A: 是的,响应格式化中间件会自动转换旧格式到新格式,无需修改现有控制器代码。
### Q: 如何在开发环境查看详细错误?
A: 开发环境下,错误响应会包含额外的 error 对象,包含详细的错误信息和堆栈跟踪。