-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
89 lines (78 loc) · 2.08 KB
/
Copy pathindex.js
File metadata and controls
89 lines (78 loc) · 2.08 KB
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
const express = require("express");
const mysql = require("mysql2/promise");
const fs = require("fs");
const path = require("path");
const { Reader } = require("@maxmind/geoip2-node");
const app = express();
const port = process.env.PORT || 9001;
const dbBuffer = fs.readFileSync(path.join(__dirname, "data", "GeoLite2.mmdb"));
const reader = Reader.openBuffer(dbBuffer);
const {
DB_HOST = "",
DB_USER = "",
DB_PASS = "",
DB_NAME = "",
DB_PORT = 3306,
API_PREFIX = "/v1",
} = process.env;
const pool = mysql.createPool({
host: DB_HOST,
user: DB_USER,
password: DB_PASS,
database: DB_NAME,
port: Number(DB_PORT),
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
});
// CORS 设置,只允许特定来源访问
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "https://ip.haruka.hk");
res.setHeader("Access-Control-Allow-Methods", "GET");
res.setHeader(
"Access-Control-Allow-Headers",
"Content-Type, Authorization"
);
next();
});
app.get(`${API_PREFIX}/user/qq/:qq`, async (req, res) => {
const qq = req.params.qq;
console.log(`Received request for qq=${qq}`);
if (!qq) {
return res.status(400).json({ error: "Missing qq parameter" });
}
try {
const [rows] = await pool.execute(
"SELECT * FROM userrole WHERE qq = ? LIMIT 1",
[qq]
);
if (rows.length === 0) {
return res.status(404).json({ error: "User not found" });
} else {
return res.json(rows[0]);
}
} catch (error) {
console.error("Database query error:", error);
return res.status(500).json({
error: "Database query error",
details: error.message,
});
}
});
app.get(`${API_PREFIX}/ip/:ip`, (req, res) => {
const ip = req.params.ip;
try {
const data = reader.country(ip);
return res.json(data);
} catch (error) {
if (error.message === "The address " + ip + " is not in the database") {
return res.status(404).send(error.message);
} else {
console.error("GeoIP lookup error:", error);
return res.status(500).send("Internal Server Error");
}
}
});
app.listen(port, () => {
console.log(`Server is listening at http://localhost:${port}`);
});