echoes/frontend/server/express.ts

72 lines
1.8 KiB
TypeScript
Raw Permalink Normal View History

import express from "express";
import cors from "cors";
import { DEFAULT_CONFIG } from "../app/env";
import { readEnvFile, writeEnvFile } from "./env";
const app = express();
const address = process.env.VITE_ADDRESS ?? DEFAULT_CONFIG.VITE_ADDRESS;
const port = Number(process.env.VITE_PORT ?? DEFAULT_CONFIG.VITE_PORT);
const ALLOWED_ORIGIN = `http://${address}:${port}`;
// 配置 CORS只允许来自 Vite 服务器的请求
app.use(
cors({
origin: (origin, callback) => {
if (!origin || origin === ALLOWED_ORIGIN) {
callback(null, true);
} else {
callback(new Error("不允许的来源"));
}
},
credentials: true,
}),
);
// 添加 IP 和端口检查中间件
const checkAccessMiddleware = (
req: express.Request,
res: express.Response,
next: express.NextFunction,
) => {
const clientIp = req.ip === "::1" ? "localhost" : req.ip;
const clientPort = Number(req.get("origin")?.split(":").pop() ?? 0);
const isLocalIp = clientIp === "localhost" || clientIp === "127.0.0.1";
const isAllowedPort = clientPort === port;
if (isLocalIp && isAllowedPort) {
next();
} else {
res.status(403).json({
error: "禁止访问",
detail: `仅允许 ${address}:${port} 访问`,
});
}
};
app.use(checkAccessMiddleware);
app.use(express.json());
app.get("/env", async (req, res) => {
try {
const envData = await readEnvFile();
res.json(envData);
} catch (error) {
res.status(500).json({ error: "读取环境变量失败" });
}
});
app.post("/env", async (req, res) => {
try {
const newEnv = req.body;
await writeEnvFile(newEnv);
res.json({ success: true });
} catch (error) {
res.status(500).json({ error: "更新环境变量失败" });
}
});
app.listen(port + 1, address, () => {
console.log(`内部服务器运行在 http://${address}:${port + 1}`);
});