87 lines
2.7 KiB
JavaScript
87 lines
2.7 KiB
JavaScript
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}`);
|
|
});
|
|
|