fix: make API not-found responses deterministic

This commit is contained in:
Qiufeng
2026-08-29 06:17:37 +08:00
parent 9719429f4a
commit 7b8c7e38f9
4 changed files with 20 additions and 7 deletions
+1 -1
View File
@@ -47,7 +47,7 @@ pnpm start
```bash ```bash
curl --proto '=https' --tlsv1.2 -fsSL \ curl --proto '=https' --tlsv1.2 -fsSL \
https://git.awaioi.com/awaioi/TallyNote/raw/branch/main/install.sh \ 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 \ --signing-key /root/tallynote-update.pub \
--update-public-key-file /root/tallynote-update.pub --update-public-key-file /root/tallynote-update.pub
``` ```
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "tallynote", "name": "tallynote",
"version": "1.0.0", "version": "1.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"packageManager": "pnpm@9.0.6", "packageManager": "pnpm@9.0.6",
+16 -5
View File
@@ -1640,13 +1640,24 @@ export async function buildApp(database: DatabaseContext, config: AppConfig) {
return reply.send(await safeReadStream(config.exportsDir, job.filePath)); 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 }); 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", "接口不存在"))); // Keep API errors structured even when the production frontend has not been
return reply.sendFile("index.html"); // 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 端口" })); app.get("/", async () => ({ name: "TallyNote", mode: "api", hint: "开发界面运行在 Vite 端口" }));
} }
+2
View File
@@ -34,6 +34,8 @@ describe("TallyNote API", () => {
process.env.TALLYNOTE_PUBLIC_ORIGIN = "http://127.0.0.1:3999"; process.env.TALLYNOTE_PUBLIC_ORIGIN = "http://127.0.0.1:3999";
process.env.TALLYNOTE_COOKIE_SECURE = "false"; process.env.TALLYNOTE_COOKIE_SECURE = "false";
config = loadConfig(); config = loadConfig();
// API tests must not depend on the ignored, locally generated dist/ tree.
config.webDir = path.join(dataDir, "missing-web");
prepareDataDirectories(config); prepareDataDirectories(config);
database = openDatabase(config); database = openDatabase(config);
app = await buildApp(database, config); app = await buildApp(database, config);