AngularFire2 5.0.0-rc.7中Firebase数据库事务使用问题咨询
在AngularFire2 5.0.0-rc.7中正确使用Firebase数据库事务
我来帮你排查这个问题!你遇到的count参数始终为null的情况,大概率是两个原因:要么是数据库路径有误,要么是没在事务回调里处理节点不存在(或读取不到值)的场景——哪怕你确定节点已经存在,事务机制也可能因为重试、网络延迟等原因让回调拿到null。
先给你一个能正常工作的实现示例,然后再解释细节:
// 假设你已经在构造函数中注入了AngularFireDatabase constructor(private db: AngularFireDatabase) {} // 执行事务的方法 updateCount() { // 获取原生Firebase数据库引用 const countRef = this.db.database.ref('path/to/my/count'); countRef.transaction(count => { // 关键:处理count为null的情况,避免NaN return (count || 0) + 1; }) .then(transactionResult => { if (transactionResult.committed) { console.log('事务提交成功,更新后的值:', transactionResult.snapshot.val()); } else { console.log('事务被中止(比如数据被其他客户端修改)'); } }) .catch(error => { console.error('事务执行失败:', error); }); }
关键细节说明:
- 路径验证:先仔细核对
'path/to/my/count'是否和Firebase控制台里的节点路径完全一致——注意大小写、层级结构,比如有没有多写/少写斜杠,或者节点名称拼写错误,这是最容易忽略的问题。 - 处理null值:Firebase事务的回调函数在节点不存在、或者初始读取失败时,会传入
null。所以必须用(count || 0)这种方式兜底,确保即使拿到null也能正常计算,避免出现NaN。 - 结果处理:事务的
then()回调会返回一个结果对象,通过committed可以判断事务是否成功提交,snapshot能拿到更新后的节点值,方便调试。 - 替代方式:你也可以通过AngularFire的
object来获取引用,效果是一样的:const countObj = this.db.object('path/to/my/count'); countObj.query.ref.transaction(count => (count || 0) + 1);
如果按照上面的代码修改后还是拿到null,建议先在控制台打印countRef.toString(),确认引用的URL是否指向正确的节点——这能快速排查路径问题。
内容的提问来源于stack exchange,提问作者Cengiz
相关产品推荐
相关产品推荐

