要開始開發之前先定義好回傳型別
import express, { Request, Response, Router } from 'express';
export interface ApiResponse<T> {
success: boolean; // 是否成功
data: T; // 泛型,用於回應資料,可以是物件、陣列等
total?: number; // 總數量,當有分頁或需要總數時使用
totalPages?: number; // 總頁數,當有分頁時使用
currentPage?: number; // 當前頁碼
message?: string; // 訊息,例如成功或錯誤的描述
}
export interface ErrorResponse {
success: boolean; // 是否成功
message: string; // 錯誤訊息
errors?: string[]; // 可選,詳細的錯誤訊息列表
error?: any; // 可選,原始錯誤訊息或錯誤物件
}
// 錯誤回覆工具函數
export const sendErrorResponse = (res: Response, statusCode: number, message: string, error?: string) => {
res.status(statusCode).json({
success: false,
message,
error,
} as ErrorResponse);
};
// 回應工具函數
export const sendSuccessResponse = <T>(
res: Response,
statusCode: number,
data: T,
options?: {
total?: number;
totalPages?: number;
currentPage?: number;
message?: string;
}
) => {
const response: ApiResponse<T> = {
success: true,
data
};
// 如果 options 存在且欄位有值,則加進回應
if (options) {
if (options.total !== undefined) {
response.total = options.total;
}
if (options.totalPages !== undefined) {
response.totalPages = options.totalPages;
}
if (options.currentPage !== undefined) {
response.currentPage = options.currentPage;
}
if (options.message) {
response.message = options.message;
}
}
res.status(statusCode).json(response);
};
雖然以前常常接觸Restful API,但這次第一次用了 PUT,以前收到的 API 修改跟新增都是 POST ,看了一下最大的差異好像就是冪(ㄇ一ˋ)等性。至於什麼是冪等性呢?指的是一個操作可以重複執行多次,並且每次執行的結果都是相同的,但我好像也沒有了解到可以解釋清楚的地步,總之我記了結論
// 新增一個 FloorPlan
router.post('/****', async (req: Request, res: Response) => {
try {
const floorPlanData: Partial<typeof FloorPlan> = req.body;
const newFloorPlan = await FloorPlan.create(floorPlanData);
sendSuccessResponse(res, 200, newFloorPlan, { message: 'successfully' });
} catch (error: any) {
sendErrorResponse(res, 500, 'Server error', error.message);
}
});
// 修改一個 FloorPlan
router.put('/****', async (req: Request, res: Response) => {
try {
const floorPlanData: Partial<typeof FloorPlan> = req.body;
const updateFloorPlan = await FloorPlan.findByIdAndUpdate(floorPlanData);
sendSuccessResponse(res, 200, updateFloorPlan, { message: 'successfully' });
} catch (error: any) {
sendErrorResponse(res, 500, 'Server error', error.message);
}
});