Braintree按客户ID查询返回含函数对象,Firebase入库失败求解决
解决Braintree客户响应含函数导致Firebase写入失败的问题
我之前也碰到过一模一样的问题!Braintree返回的客户对象其实是他们SDK封装的类实例,里面自带了getGateway这类内部方法,而Firebase Realtime Database(或者Firestore)只接受可JSON序列化的数据——函数显然不在这个范围内,所以写入的时候就会抛出你看到的那个错误。
下面是我试过的两种有效解决方法:
方法1:手动提取需要的字段(推荐)
最稳妥的方式是不要直接存整个Braintree返回的对象,而是挑选你业务需要的字段,手动构建一个纯JSON对象。这样既能避免冗余数据,也能精准控制存入数据库的内容:
// 假设你从Braintree获取到的客户对象是customer const cleanCustomerData = { id: customer.id, email: customer.email, createdAt: customer.createdAt, creditCards: customer.creditCards.map(card => ({ token: card.token, last4: card.last4, expirationMonth: card.expirationMonth, expirationYear: card.expirationYear, cardType: card.cardType // 只保留你需要的信用卡字段,跳过getGateway这类方法 })) }; // 写入Firebase数据库 await admin.database() .ref(`Wallets/${userId}/Accountdetails`) .set(cleanCustomerData);
方法2:用JSON序列化自动剔除函数
如果你不想手动挑字段,可以借助JSON的序列化/反序列化特性,把带函数的对象转成纯JSON结构——这个过程中所有函数和不可序列化的属性都会被自动剔除。不过要注意,这种方法可能会丢失一些你需要的、但不可序列化的字段,所以用之前最好先确认数据:
const braintreeCustomer = await gateway.customer.find(customerId); // 序列化再反序列化,清除所有函数和非JSON属性 const cleanCustomer = JSON.parse(JSON.stringify(braintreeCustomer)); // 写入Firebase await admin.database() .ref(`Wallets/${userId}/Accountdetails`) .set(cleanCustomer);
本质上,这个问题的核心就是Braintree返回的是带方法的类实例,而Firebase只接受纯数据对象。上面两种方法都能帮你把数据转成符合要求的格式,你可以根据自己的需求选一种。
内容的提问来源于stack exchange,提问作者Dileep Bolisetti
相关产品推荐
相关产品推荐

