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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:02