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

GitHub Apps WebHook请求无Payload问题求助

解决GitHub WebHook请求体无法在Express服务器中获取的问题

嘿,我之前也踩过这个坑!你的Express服务器收不到WebHook的请求体,核心原因是默认情况下Express不会自动解析JSON格式的请求体,而GitHub WebHook发送的事件 payload 正是JSON格式的。下面是具体的解决步骤:

1. 添加JSON解析中间件

在你的路由定义之前,加上express.json()中间件,让Express能够解析GitHub发送的JSON请求体:

const express = require("express");
const app = express();

// 这一行是关键!必须放在路由前面
app.use(express.json());

app.post("/watch", (req, res) => { 
  console.log("收到GitHub WebHook事件:", req.body);
  // 一定要返回200状态码,GitHub需要确认请求已成功接收
  res.status(200).send("OK");
});

app.listen(3000, () => console.log("服务器已启动在3000端口"));

2. 检查GitHub WebHook的Content-Type设置

登录GitHub仓库的WebHook配置页面,确认Content type选项设置为application/json(这是默认选项,但有时候可能被误改)。如果设置成了application/x-www-form-urlencoded,你还需要额外添加app.use(express.urlencoded({ extended: true }))中间件,但GitHub推荐用JSON格式。

3. 别忘了返回成功响应

GitHub会持续重试未收到成功响应(2xx状态码)的WebHook请求,所以在处理完事件后,一定要用res.status(200)返回一个简单的响应,避免重复收到相同事件。

进阶:添加签名验证(可选但推荐)

为了确保WebHook请求确实来自GitHub,你可以配置签名验证:

  • 在GitHub WebHook设置里设置一个Secret
  • 在Express服务器中,用crypto模块验证请求头x-hub-signature-256的签名,确认请求未被篡改。

内容的提问来源于stack exchange,提问作者yakkisyou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:31