feat: 优化API错误处理、CORS支持、请求日志、404处理

- 添加CORS headers支持跨域访问
- 添加请求日志记录
- 改善各API的错误处理
- 添加404处理器
- 添加timestamp返回便于调试
This commit is contained in:
Midas
2026-06-23 22:53:14 +08:00
parent 62e92a08bc
commit b7093816f0
+53 -12
View File
@@ -2,37 +2,73 @@ const express = require('express');
const path = require('path'); const path = require('path');
const app = express(); const app = express();
const PORT = 3000; const PORT = process.env.PORT || 3000;
// Middleware // Middleware
app.use(express.json()); app.use(express.json());
app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public')));
// CORS headers
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
// Request logging
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
console.log(`${req.method} ${req.path} - ${res.statusCode} (${duration}ms)`);
});
next();
});
// API: 搜索优惠券 (预留淘宝/京东联盟API接入点) // API: 搜索优惠券 (预留淘宝/京东联盟API接入点)
app.get('/api/search', async (req, res) => { app.get('/api/search', async (req, res) => {
const { keyword } = req.query; const { keyword } = req.query;
if (!keyword) { if (!keyword) {
return res.json({ success: false, message: '请输入搜索关键词' }); return res.status(400).json({ success: false, message: '请输入搜索关键词' });
} }
// TODO: 接入淘宝联盟API / 京东联盟API try {
// 目前返回模拟数据用于本地验证 // TODO: 接入淘宝联盟API / 京东联盟API
const mockResults = generateMockResults(keyword); // 目前返回模拟数据用于本地验证
res.json({ success: true, data: mockResults }); const mockResults = generateMockResults(keyword);
res.json({ success: true, data: mockResults, keyword, timestamp: Date.now() });
} catch (error) {
console.error('搜索API错误:', error);
res.status(500).json({ success: false, message: '服务器错误,请重试' });
}
}); });
// API: 今日特价 // API: 今日特价
app.get('/api/today-deals', (req, res) => { app.get('/api/today-deals', (req, res) => {
// TODO: 接入真实特价API try {
const deals = generateMockDeals(); // TODO: 接入真实特价API
res.json({ success: true, data: deals }); const deals = generateMockDeals();
res.json({ success: true, data: deals, timestamp: Date.now() });
} catch (error) {
console.error('特价API错误:', error);
res.status(500).json({ success: false, message: '服务器错误,请重试' });
}
}); });
// API: 线报广场 // API: 线报广场
app.get('/api/linbao', (req, res) => { app.get('/api/linbao', (req, res) => {
// TODO: 接入线报数据源 try {
const linbao = generateMockLinbao(); // TODO: 接入线报数据源
res.json({ success: true, data: linbao }); const linbao = generateMockLinbao();
res.json({ success: true, data: linbao, timestamp: Date.now() });
} catch (error) {
console.error('线报API错误:', error);
res.status(500).json({ success: false, message: '服务器错误,请重试' });
}
}); });
// API: 历史价格查询 (预留) // API: 历史价格查询 (预留)
@@ -60,6 +96,11 @@ app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html')); res.sendFile(path.join(__dirname, 'public', 'index.html'));
}); });
// 404 handler
app.use((req, res) => {
res.status(404).json({ success: false, message: 'API不存在' });
});
// Mock data generators // Mock data generators
function generateMockResults(keyword) { function generateMockResults(keyword) {
return [ return [