diff --git a/README.md b/README.md index 0120dd7..117e6d5 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ pnpm start ```bash curl --proto '=https' --tlsv1.2 -fsSL \ https://git.awaioi.com/awaioi/TallyNote/raw/branch/main/install.sh \ - | sudo bash -s -- --apply --version 1.0.0 \ + | sudo bash -s -- --apply --version 1.0.1 \ --signing-key /root/tallynote-update.pub \ --update-public-key-file /root/tallynote-update.pub ``` diff --git a/package.json b/package.json index be357c8..55fa1dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tallynote", - "version": "1.0.0", + "version": "1.0.1", "private": true, "type": "module", "packageManager": "pnpm@9.0.6", diff --git a/server/app.ts b/server/app.ts index 97cb04b..13acd35 100644 --- a/server/app.ts +++ b/server/app.ts @@ -1640,13 +1640,24 @@ export async function buildApp(database: DatabaseContext, config: AppConfig) { return reply.send(await safeReadStream(config.exportsDir, job.filePath)); }); - if (existsSync(config.webDir)) { + const hasWeb = existsSync(config.webDir); + if (hasWeb) { await app.register(fastifyStatic, { root: config.webDir, wildcard: false }); - app.setNotFoundHandler((request, reply) => { - if (request.url.startsWith("/api/")) return reply.code(404).send(errorPayload(request, new AppError(404, "NOT_FOUND", "接口不存在"))); - return reply.sendFile("index.html"); + } + // Keep API errors structured even when the production frontend has not been + // built yet (for example in a clean CI checkout or an API-only process). + app.setNotFoundHandler((request, reply) => { + if (request.url.split("?", 1)[0]!.startsWith("/api/")) { + return reply.code(404).send(errorPayload(request, new AppError(404, "NOT_FOUND", "接口不存在"))); + } + if (hasWeb) return reply.sendFile("index.html"); + return reply.code(404).send({ + message: `Route ${request.method}:${request.url} not found`, + error: "Not Found", + statusCode: 404, }); - } else { + }); + if (!hasWeb) { app.get("/", async () => ({ name: "TallyNote", mode: "api", hint: "开发界面运行在 Vite 端口" })); } diff --git a/tests/api.test.ts b/tests/api.test.ts index 74cb525..022e3d6 100644 --- a/tests/api.test.ts +++ b/tests/api.test.ts @@ -34,6 +34,8 @@ describe("TallyNote API", () => { process.env.TALLYNOTE_PUBLIC_ORIGIN = "http://127.0.0.1:3999"; process.env.TALLYNOTE_COOKIE_SECURE = "false"; config = loadConfig(); + // API tests must not depend on the ignored, locally generated dist/ tree. + config.webDir = path.join(dataDir, "missing-web"); prepareDataDirectories(config); database = openDatabase(config); app = await buildApp(database, config);