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
相关产品推荐
相关产品推荐

