使用Node.js+Stripe实现账户间转账提现遇ERR_ASSERTION错误求助
我来帮你搞定这个ERR_ASSERTION错误的问题~首先得明确,这个错误是Node.js断言模块抛出来的,说明代码(大概率是Stripe SDK内部)有个检查没通过——预期某个值是true,但实际是false。结合你的代码和场景,我整理了几个实用的排查方向:
1. 先搞对API:Transfer和Payout别用混
你说要做“提现功能”,但当前代码用的是stripe.transfers.create——这个API是给Stripe账户之间转账用的(比如平台给关联的子账户打钱),而如果是从Stripe账户把钱提现到用户的银行卡/银行账户,应该用stripe.payouts.create。用错API很可能触发SDK内部的参数断言检查失败,这是常见坑!
如果是提现场景,把代码改成这样试试:
const payoutState = await stripe.payouts.create({ amount: 400, // 注意单位是分,400就是4美元 currency: 'usd', destination: targetId, // 这里的targetId得是用户关联的bank_account或card的ID,比如ba_xxx或card_xxx });
2. 修复变量作用域的小问题
你代码里先声明了let payoutState = null;,然后在内部try块里又用const payoutState = ...重新声明,这会导致内部的变量把外部的给覆盖了——等catch块里访问payoutState时,拿到的还是最开始的null,虽然这不一定是断言错误的直接原因,但会让你的错误日志不准,建议统一改成:
let payoutState = null; try { payoutState = await stripe.transfers.create({ // 去掉const,直接赋值给外层的变量 amount: 400, currency: 'usd', destination: targetId, source_type: 'bank_account', }); // ... 你的记录逻辑 } catch (error) { return ctx.send(null, { error, payoutState, }); }
3. 仔细核对Stripe参数的合法性
断言错误一般都是参数不符合SDK预期导致的,你可以逐一检查:
targetId(也就是cardInfo.account_id):如果是转账场景,得是有效的Stripe连接账户ID(格式acct_xxx);如果是提现场景,得是用户关联的银行账户/银行卡ID(ba_xxx/card_xxx),别传错格式。amount参数:确保是整数(Stripe用分做单位),USD的最小金额是1分,你的400是合法的,但要确认币种和金额匹配。- 账户状态:检查你的Stripe平台账户是否有足够余额,连接的子账户(如果用转账)是否完成了身份验证,这些都可能导致底层断言失败。
4. 试试升级/降级Stripe SDK版本
有时候SDK内部的断言逻辑在某个版本可能有bug,你可以先升级到最新版试试:
npm install stripe@latest
如果最新版还是有问题,降级到一个稳定的旧版本(比如stripe@12.0.0)再测试,说不定能解决问题。
5. 打印完整错误堆栈定位根源
你可以在catch块里打印错误的完整堆栈信息,这样能精准找到是SDK哪一行代码触发的断言:
catch (error) { console.error('Stripe错误详情:', error.stack); return ctx.send(null, { error, payoutState, }); }
看堆栈里的文件路径和行号,就能知道是哪个参数或逻辑导致的断言失败,排查起来更高效。
内容的提问来源于stack exchange,提问作者user11847513

