From b7093816f084e313fb62fd8f40bc4a0ae1e5d988 Mon Sep 17 00:00:00 2001 From: Midas Date: Tue, 23 Jun 2026 22:53:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96API=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E3=80=81CORS=E6=94=AF=E6=8C=81=E3=80=81?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=97=A5=E5=BF=97=E3=80=81404=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加CORS headers支持跨域访问 - 添加请求日志记录 - 改善各API的错误处理 - 添加404处理器 - 添加timestamp返回便于调试 --- server.js | 65 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 12 deletions(-) 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 [