const express = require('express'); const fs = require('fs').promises; const path = require('path'); const cors = require('cors'); const bodyParser = require('body-parser'); const app = express(); const DATA_DIR = path.join(__dirname, 'data'); const DATA_FILE = path.join(DATA_DIR, 'urls.json'); const PORT = process.env.PORT || 3000; // 中间件 app.use(cors()); app.use(bodyParser.json({ limit: '10mb' })); app.use(express.static('public')); // 确保数据目录存在 async function ensureDataDir() { try { await fs.mkdir(DATA_DIR, { recursive: true }); } catch (error) { console.error('创建数据目录失败:', error); } } // 读取数据 app.get('/api/urls', async (req, res) => { try { await ensureDataDir(); const data = await fs.readFile(DATA_FILE, 'utf8'); res.json(JSON.parse(data)); } catch (error) { if (error.code === 'ENOENT') { // 文件不存在,返回空数据 res.json({ urls: [], categories: [] }); } else { console.error('读取数据失败:', error); res.status(500).json({ error: '读取数据失败', message: error.message }); } } }); // 保存数据 app.post('/api/urls', async (req, res) => { try { await ensureDataDir(); const data = { urls: req.body.urls || [], categories: req.body.categories || [], lastUpdated: new Date().toISOString() }; console.log('收到保存请求:', { urlsCount: data.urls.length, categoriesCount: data.categories.length, timestamp: data.lastUpdated }); await fs.writeFile(DATA_FILE, JSON.stringify(data, null, 2), 'utf8'); // 验证文件是否写入成功 const verifyData = await fs.readFile(DATA_FILE, 'utf8'); const verifyJson = JSON.parse(verifyData); console.log('数据已保存,验证:', { urlsCount: verifyJson.urls.length, categoriesCount: verifyJson.categories.length }); res.json({ success: true, message: '数据保存成功', savedCount: { urls: data.urls.length, categories: data.categories.length } }); } catch (error) { console.error('保存数据失败:', error); res.status(500).json({ error: '保存数据失败', message: error.message }); } }); // 健康检查 app.get('/api/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); // 启动服务器 app.listen(PORT, () => { console.log(`Workdizhi 服务器运行在端口 ${PORT}`); console.log(`数据文件位置: ${DATA_FILE}`); });