自定义路径下Github App Node中间件为何拒绝所有请求?
问题原因及解决办法
核心原因
- 参数传递错误:Octokit 3.x 版本中,
createNodeMiddleware的第一个参数要求传入完整的App实例,而非单独的app.webhooks对象。旧写法会导致中间件无法正确处理请求上下文,进而拒绝所有请求。 - 缺失Webhook密钥配置:Octokit 3.x 强制启用请求签名校验,如果初始化
App时未指定webhooks.secret,GitHub 发送的所有请求都会因签名验证失败被直接拦截。
修复后的代码
import { createServer } from "node:http" import { App, createNodeMiddleware } from "octokit" // 注意:webhooks.secret必须和GitHub仓库Webhook设置中的Secret完全一致 const app = new App({ appId: "你的AppID", privateKey: "你的私钥内容", webhooks: { secret: "你的Webhook密钥" } }) // 第一个参数直接传入完整的App实例 createServer(createNodeMiddleware(app, { path: "/myapi/github/webhooks" })).listen(3001)
额外校验项
- 确认 GitHub 仓库 Webhook 设置里的 Payload URL 与代码中的
path完全匹配(包含端口、完整路径)。 - 确保 Webhook 的 Content type 设为
application/json,Octokit 中间件默认仅处理 JSON 格式请求。 - 检查服务器或反向代理是否修改了
X-Hub-Signature-256请求头,该头是签名校验的核心依据,被修改会导致验证失败。
内容的提问来源于stack exchange,提问作者Aphex
相关产品推荐
相关产品推荐

