如何配置Express的GET类型/healthcheck接口,仅允许GET请求返回200,其他请求均返回404?
要实现这个需求,核心是要阻止Express默认的app.get()路由处理HEAD请求,同时显式拦截OPTIONS和其他所有非GET方法对/healthcheck的请求。这里有两种简单可靠的实现方式:
方法一:使用前置中间件拦截非GET请求
这种方法最直观,通过一个专门针对/healthcheck的中间件,先检查请求方法,只有GET方法才允许进入后续的处理逻辑,其他方法直接返回404:
// 先添加拦截中间件 app.use('/healthcheck', (req, res, next) => { // 只允许GET方法,其他所有方法直接返回404 if (req.method !== 'GET') { return res.sendStatus(404); } next(); }); // 你的原有GET路由 app.get('/healthcheck', (_req, res) => { res.status(200).send({ state: 'Healthy', timestamp: new Date(), uptime: process.uptime() }); });
方法二:显式注册其他方法的路由返回404
如果你不想用中间件,也可以为每个非GET方法单独注册路由,直接返回404。这种方式更明确,适合需要对不同方法做不同处理的场景:
// 你的原有GET路由 app.get('/healthcheck', (_req, res) => { res.status(200).send({ state: 'Healthy', timestamp: new Date(), uptime: process.uptime() }); }); // 拦截HEAD请求 app.head('/healthcheck', (req, res) => res.sendStatus(404)); // 拦截OPTIONS请求 app.options('/healthcheck', (req, res) => res.sendStatus(404)); // 拦截其他所有方法(POST/PUT/PATCH/DELETE等) app.all('/healthcheck', (req, res) => res.sendStatus(404));
补充说明:为什么原来的HEAD请求会返回200?
Express的app.get()方法默认会同时处理GET和HEAD请求,这是符合HTTP规范的(HEAD请求要求返回与GET相同的状态码,但不返回响应体)。如果你不需要这个默认行为,就需要像上面那样手动拦截HEAD请求。
测试验证:
- 执行
curl --location --request GET 'http://localhost:2003/healthcheck'会返回200和健康状态数据 - 执行
curl --location --head 'http://localhost:2003/healthcheck'或curl --location --request POST 'http://localhost:2003/healthcheck'都会返回404
内容的提问来源于stack exchange,提问作者Divya Singh
相关产品推荐
相关产品推荐

