You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:22:48