Spaces:
Paused
Paused
// === 引入依赖 === | |
const express = require('express'); | |
const bodyParser = require('body-parser'); | |
const cors = require('cors'); | |
const requestIp = require('request-ip'); | |
const crypto = require('crypto'); | |
const { URL } = require('url'); | |
const app = express(); | |
// === 配置常量 === | |
const PORT = process.env.PORT || 3000; | |
const HOST = '0.0.0.0'; | |
console.log(`Starting server! PORT: ${PORT}`); | |
// === 中间件配置 === | |
const corsOptions = { | |
origin: '*', | |
methods: ['GET', 'POST', 'OPTIONS'], | |
allowedHeaders: ['Content-Type'], | |
}; | |
app.use(cors(corsOptions)); | |
app.use(bodyParser.json()); | |
app.use(requestIp.mw()); | |
// === 内存存储 === | |
const urlMap = new Map(); | |
const EXPIRATION_TIME = 90 * 1000; // 90 秒 | |
const CLEANUP_INTERVAL = 60 * 1000; | |
// 定期清理任务 | |
setInterval(() => { | |
const now = Date.now(); | |
const expiredTime = now - EXPIRATION_TIME; | |
for (const [userId, { timestamp }] of urlMap) { | |
if (timestamp < expiredTime) { | |
console.log(`Deleting expired data for user: ${userId}`); | |
urlMap.delete(userId); | |
} | |
} | |
}, CLEANUP_INTERVAL); | |
// === 路由 === | |
// 健康检查 | |
app.get("/", (req, res) => { | |
res.status(200).send({ message: "Server is healthy and running." }); | |
}); | |
// 存储 URL | |
app.post('/storeURL', (req, res) => { | |
const url = req.body.url; | |
const ip = req.clientIp; | |
if (!url) { | |
return res.status(400).json({ success: false, message: 'URL is required.' }); | |
} | |
try { | |
new URL(url); | |
} catch (err) { | |
return res.status(400).json({ success: false, message: 'Invalid URL format.' }); | |
} | |
const fingerprint = crypto.createHash('sha256').update(`${ip}-${req.headers['user-agent']}`).digest('hex'); | |
const userId = `${ip}-${fingerprint}`; | |
urlMap.set(userId, { url, timestamp: Date.now() }); | |
console.log(`Stored URL for user: ${userId}`); | |
res.json({ success: true, message: 'URL stored successfully.', userId }); | |
}); | |
// 获取 URL | |
app.get('/getURL', (req, res) => { | |
const ip = req.clientIp; | |
const fingerprint = crypto.createHash('sha256').update(`${ip}-${req.headers['user-agent']}`).digest('hex'); | |
const userId = `${ip}-${fingerprint}`; | |
if (urlMap.has(userId)) { | |
const storedData = urlMap.get(userId); | |
storedData.timestamp = Date.now(); | |
urlMap.set(userId, storedData); | |
console.log(`Retrieved URL for user: ${userId}`); | |
res.json({ success: true, url: storedData.url }); | |
} else { | |
console.error(`No URL found for user: ${userId}`); | |
res.status(404).json({ success: false, message: 'URL not found for this user.' }); | |
} | |
}); | |
// === 启动服务器 === | |
app.listen(PORT, HOST, (err) => { | |
if (err) { | |
console.error(`Error starting server: ${err}`); | |
process.exit(1); | |
} | |
console.log(`Server running on http://${HOST}:${PORT}`); | |
}); | |
// === 全局错误处理 === | |
process.on('uncaughtException', (err) => { | |
console.error('Uncaught Exception:', err); | |
}); | |
process.on('unhandledRejection', (reason, promise) => { | |
console.error('Unhandled Rejection at:', promise, 'reason:', reason); | |
}); | |