diff --git a/server/src/index.ts b/server/src/index.ts index 26ca87f..5b1dda9 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -196,7 +196,25 @@ app.get('/', (_req: Request, res: Response) => { }); app.get('/api/health', (_req: Request, res: Response) => { - res.json({ status: 'healthy', database: 'connected', uptime: process.uptime() }); + // features 用于部署自检:小程序请求新接口 404 时,可先 curl 本接口确认线上构建是否已更新 + res.json({ + status: 'healthy', + database: 'connected', + uptime: process.uptime(), + build: '2026-10-19', + features: { + userToken: true, + adminPasswordGate: true, + securityHeaders: true, + rateLimit: true, + errorSanitize: true, + adminTokenRevoke: true, + notifications: true, + expertServicesSelfManage: true, + coupons: true, + companionSearch: true, + }, + }); }); // 统一校验用户是否处于封禁状态 diff --git a/server/tests/deploy-selfcheck.spec.ts b/server/tests/deploy-selfcheck.spec.ts new file mode 100644 index 0000000..cf1c686 --- /dev/null +++ b/server/tests/deploy-selfcheck.spec.ts @@ -0,0 +1,19 @@ +// 已读取AGENTS.md +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * 第八十批:部署自检(/api/health 回报构建能力,便于定位"小程序新、后端旧"的 404)。 + */ +describe('第八十批部署自检闸门', () => { + const root = path.resolve(__dirname, '../../'); + const indexCode = fs.readFileSync(path.join(root, 'server/src/index.ts'), 'utf-8'); + + it('/api/health 返回 build 与 features 能力清单', () => { + expect(indexCode).toContain('build: '); + expect(indexCode).toContain('features: {'); + for (const f of ['notifications', 'coupons', 'companionSearch', 'expertServicesSelfManage', 'rateLimit', 'adminTokenRevoke']) { + expect(indexCode).toContain(`${f}: true`); + } + }); +});