feat: 优化API错误处理、CORS支持、请求日志、404处理
- 添加CORS headers支持跨域访问 - 添加请求日志记录 - 改善各API的错误处理 - 添加404处理器 - 添加timestamp返回便于调试
This commit is contained in:
@@ -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: '请输入搜索关键词' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
// TODO: 接入淘宝联盟API / 京东联盟API
|
// TODO: 接入淘宝联盟API / 京东联盟API
|
||||||
// 目前返回模拟数据用于本地验证
|
// 目前返回模拟数据用于本地验证
|
||||||
const mockResults = generateMockResults(keyword);
|
const mockResults = generateMockResults(keyword);
|
||||||
res.json({ success: true, data: mockResults });
|
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) => {
|
||||||
|
try {
|
||||||
// TODO: 接入真实特价API
|
// TODO: 接入真实特价API
|
||||||
const deals = generateMockDeals();
|
const deals = generateMockDeals();
|
||||||
res.json({ success: true, data: deals });
|
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) => {
|
||||||
|
try {
|
||||||
// TODO: 接入线报数据源
|
// TODO: 接入线报数据源
|
||||||
const linbao = generateMockLinbao();
|
const linbao = generateMockLinbao();
|
||||||
res.json({ success: true, data: linbao });
|
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 [
|
||||||
|
|||||||
Reference in New Issue
Block a user