Firebase Admin事务执行一次后永久挂起,无回调无Promise结果求助
Firebase Realtime Database事务永久挂起、回调不触发的解决方案
核心问题是你给事务传递了异步更新函数(async修饰的函数),Firebase Realtime Database的事务更新函数要求必须是同步执行的——它需要你直接返回要提交的新数据,而不是返回一个Promise。当你用async时,函数会自动返回Promise,Firebase会把这个Promise当作要写入的数据,导致事务无法正常完成,进而出现挂起、回调不触发、Promise既不resolve也不reject的情况。
解决步骤:
- 移除更新函数的
async关键字,确保函数同步执行,直接返回处理后的service对象或null。 - 如果业务逻辑里有异步操作,需要把这些异步逻辑移到事务外部完成,再将结果带入事务中;不推荐在事务内做异步操作,会增加重试开销和复杂度。
修正后的代码示例:
import * as fb from 'firebase-admin'; const fbApp = fb.initializeApp({ projectId: 'my-project', databaseURL: 'https://my-project.firebaseapp.com' }); // ... await fbApp .database() .ref(`services/${serviceId}`) .transaction((service: Service | null) => { console.log(service); // 现在会根据重试逻辑正常输出 if(service) { // 同步执行逻辑并修改service } return service; }, (e, committed, data) => { console.log(e, committed, data); // 事务完成后会正常触发 }); console.log('done'); // 现在会正常执行到这里
内容的提问来源于stack exchange,提问作者chrispytoes
相关产品推荐
相关产品推荐

