Spaces:
Paused
Paused
File size: 3,144 Bytes
6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 6279ff0 1e6a865 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
// === 引入依赖 ===
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);
});
|