为 Express.js 发布状态页的三种方式
选择所需的控制级别 — 零代码、低代码或完全 headless。
托管
添加 Express.js 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。
嵌入式徽章
将 SVG 正常运行时间和状态徽章放入 README 或落地页。每 5 分钟自动更新。
把这个 health 端点加入你的 Express.js 应用
复制、粘贴、把 PulseAPI 指向 URL。健康时返回 200,降级时返回 503。
src/routes/health.ts
import { Router } from 'express'
import { db } from '../db'
import { redis } from '../redis'
const router = Router()
router.get('/health', async (_, res) => {
const checks: Record<string, string> = {}
try { await db.raw('select 1'); checks.database = 'ok' } catch { checks.database = 'fail' }
try { const pong = await redis.ping(); checks.cache = pong === 'PONG' ? 'ok' : 'fail' } catch { checks.cache = 'fail' }
const healthy = Object.values(checks).every((v) => v === 'ok')
res.status(healthy ? 200 : 503).json({
status: healthy ? 'healthy' : 'degraded',
...checks,
})
})
export { router as healthRouter }挂在认证中间件之前。下游检查使用短超时以避免探针卡顿。
Express.js 应用会出什么故障 — 如何捕获
未处理的 Promise rejection
在旧 Node 上异步 bug 可能让进程静默崩溃。Uptime 检查能在几秒内捕获 502。
中间件顺序 bug
重排中间件会在特定路径漏 500。多端点监控可揭示。
随时间累积的内存泄漏
慢泄漏要数小时才显现。响应时间告警在 GC 暂停出现时触发。
Headless 视角
不喜欢我们的状态页? 用 Express.js 自己构建。
我们的 API 返回的数据与托管 UI 完全一致。完整 OpenAPI 规范见 api.pulseapi.tech/docs.
渲染自定义状态页的 Express handler。
router.get('/status', async (_, res) => {
const r = await fetch('https://api.pulseapi.tech/status/acme', {
signal: AbortSignal.timeout(5000),
})
const data = await r.json()
res.render('status', { data })
})Express.js 监控 — FAQ
能与 Express 4、5、Connect 或 Fastify 使用吗?
任何 Node HTTP 框架。PulseAPI 对应用是外部的。
能否监控 BullMQ / Agenda 队列?
可以。端点返回队列深度和 worker 心跳,断言阈值和心跳新鲜度。
能处理 HTTPS 重定向吗?
可以。PulseAPI 跟随重定向并对最终响应断言。
能否在 Express 内嵌入状态页?
可以。在 handler 中调用公共 API,用 EJS/Pug/Handlebars 渲染或将 JSON 传给前端。