У нас было прекрасное маленькое приложение, которое функционировало отлично, а затем нас попросили превратить его в то, что другие в нашей организации могли бы использовать ... и это сломало все.У нас был простой экспресс-сервер с несколькими API-маршрутами, а также обслуживаемое приложение реагирования.
Изначально мы обращались к нашему приложению с помощью шаблона URL, например: https://our_team_name.company.com/app_name/
У нас было экспресс-прослушивание маршрутов.например:
// server.js:
import "./env";
import app from "app";
import { logger } from "@company/shared-code";
let fs = require("fs");
let https = require("https");
let privateKey = fs.readFileSync(`${process.env.CERT_HOME}/server.key`, "utf8");
let certificate = fs.readFileSync(`${process.env.CERT_HOME}/server.crt`, "utf8");
let credentials = { key: privateKey, cert: certificate };
let httpsServer = https.createServer(credentials, app);
httpsServer.listen(process.env.PORT || 3000, function () {
logger.info("Application listening on port " + (process.env.PORT || 3000) + "!");
});
// app.js:
import express from "express";
import health from "./routes/health/health.js";
const app = express();
app.use("/app_name/rest/health", health);
app.use(express.static(path.join(process.cwd(), "build")));
app.get("/app_name/ui*", function(req, res) {
res.sendFile(path.join(process.cwd(), "build", "index.html"));
});
// health.js:
import express from "express";
import os from "os";
import Promise from "bluebird";
const disk = Promise.promisifyAll(require("diskusage"));
const health = express.Router();
health.get("*", async (req, res) => {
const { available, total } = await disk.checkAsync(os.platform() === "win32" ? "c:" : "/");
try {
res.send({
timestamp: Date.now(),
results: [
{
testName: "System",
status: "OK",
message: "System Information",
platform: os.platform(),
processing: {
architecture: os.arch(),
cpu: {
count: os.cpus().length,
cpus: os.cpus(),
},
avgLoad: os.loadavg(),
},
memory: {
totalMemory: (os.totalmem() / 1000000000).toFixed(2) + "GB",
freeMemory: (os.freemem() / 1000000000).toFixed(2) + "GB",
},
disk: {
available: (available / 1000000000).toFixed(2) + "GB",
total: (total / 1000000000).toFixed(2) + "GB",
percentFull: (((total - available) / total) * 100).toFixed(2) + "%",
},
},
],
status: "OK",
});
} catch (err) {
res.status(520).send({
err,
});
}
});
export default health;
Express перехватил «остальные» маршруты (например, https://our_team_name.company.com/app_name/rest/health) и обслужил контент, а также перехватил «ui» маршруты и обслужил index.html, который имел реагирующий маршрутизатор для обработки клиентской сторонымаршруты, и все были счастливы.
Чтобы мы могли предоставить соответствующие сертификаты новым командам, которые использовали это, мы получили новый групповой сертификат, который охватывал * .technology.company.com / app_name /, поэтому следующая командамы можем раскошелиться на репозиторий и развернуть его без необходимости получения новых сертификатов ... отлично.
Мы поздравили себя с хорошо выполненной работой и развернули эту новую конфигурацию. Однако после перехода на https://our_team_name.technology.company.com/app_name/ это сейчаскажется, что каждый маршрут обслуживается get ("/ app_name / ui * ") ... несмотря на то, что я слишком много времени пытался отладить, я не смог понять, почему мои" остальные "маршруты не определены, или даже воссоздать это поведение через localhost.
В настоящее время запрашивающий https://our_team_name.technology.company.com/app_name/rest/health имеет ответ index.html и маршрут работоспособности никогда не вызывается.
Кто-нибудь сталкивался с подобной проблемой?
ОБНОВЛЕНИЕ: добавлены дополнительные подробности реализации