Node.js接收Patreon webhook时报event is not defined错误如何解决
问题原因
你当前使用的是Express框架的路由处理逻辑,Express的POST路由回调接收的第一个参数是请求对象(req),不存在名为event的内置变量,event通常是Serverless云函数的入参,所以会报ReferenceError: event is not defined错误。
修正方案
你需要做两处调整:
- 把代码中所有
event替换为req - 补充raw原始请求体解析配置,直接使用JSON解析会破坏原始请求内容,导致签名校验失败
修正后的完整代码
const express = require('express'); const crypto = require('crypto'); const app = express(); const PATREON_WEBHOOK_SECRET = 'patreon-secret-removed ;)'; // 必须使用raw原始body解析,才能正确校验Patreon签名 app.use(express.raw({ type: 'application/json' })); app.post('/', async (req, res) => { try { const hash = req.headers['x-patreon-signature']; const hmac = crypto.createHmac("md5", PATREON_WEBHOOK_SECRET); hmac.update(req.body); const crypted = hmac.digest("hex"); if (crypted === hash) { console.log("签名校验通过: " + hash); // 校验通过后可执行自定义业务逻辑 res.status(200).send('ok'); } else { console.log("签名校验失败,传入签名: " + hash + " 计算得到签名: " + crypted); res.status(403).send('Invalid signature'); } } catch (err) { console.error('处理webhook请求出错:', err); res.status(500).send('Internal error'); } }) app.listen(8080, () => { console.log('服务已启动,监听端口8080'); })
注意事项
- Patreon返回的请求头会自动转为全小写格式,使用
x-patreon-signature小写取值兼容性更高 - 不要使用
express.json()或者bodyParser.json()做请求体解析,解析后的JSON对象不是原始字符串,会导致计算的签名不匹配 - 必须给请求返回响应,否则Patreon会判定webhook投递失败,触发多次重试机制
内容的提问来源于stack exchange,提问作者Bob joe12
相关产品推荐
相关产品推荐

