diff --git a/server.js b/server.js index f8a45e9..1a0ca05 100644 --- a/server.js +++ b/server.js @@ -2,37 +2,73 @@ const express = require('express'); const path = require('path'); const app = express(); -const PORT = 3000; +const PORT = process.env.PORT || 3000; // Middleware app.use(express.json()); 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接入点) app.get('/api/search', async (req, res) => { const { keyword } = req.query; if (!keyword) { - return res.json({ success: false, message: '请输入搜索关键词' }); + return res.status(400).json({ success: false, message: '请输入搜索关键词' }); } - // TODO: 接入淘宝联盟API / 京东联盟API - // 目前返回模拟数据用于本地验证 - const mockResults = generateMockResults(keyword); - res.json({ success: true, data: mockResults }); + try { + // TODO: 接入淘宝联盟API / 京东联盟API + // 目前返回模拟数据用于本地验证 + 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: 今日特价 app.get('/api/today-deals', (req, res) => { - // TODO: 接入真实特价API - const deals = generateMockDeals(); - res.json({ success: true, data: deals }); + try { + // TODO: 接入真实特价API + 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: 线报广场 app.get('/api/linbao', (req, res) => { - // TODO: 接入线报数据源 - const linbao = generateMockLinbao(); - res.json({ success: true, data: linbao }); + try { + // TODO: 接入线报数据源 + 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: 历史价格查询 (预留) @@ -60,6 +96,11 @@ app.get('/', (req, res) => { 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 function generateMockResults(keyword) { return [