使用JavaScript库运行Firestore事务时,出现Firebase错误“错误:getToken因令牌更改而中止”。错误不会每次都抛出,我找不到模式。我想我已经在某个地方实现了一些比赛条件。

我的应用程序中的用户流如下所示:


注册一个新帐户并以相同形式提交其他字符串
注册后使用相同的凭据登录用户
登录后,使用该附加字符串并将其保存到Firestore(在事务中)。
由于Error: getToken aborted due to token change.,交易失败


承诺流:

    firebase.auth().createUserWithEmailAndPassword(email, password)
      .catch(signupError => {
        // no problems here
      })
      .then(() => {
        return firebase.auth().signInWithEmailAndPassword(email, password)
      })
      .catch(loginError => {
        // no problem here
      })
      .then((user) => {
        // Database write call which fails (see lower code block)
        return this.claimInput.writeClaimedPlace(user.user.uid, claimedPlace);
      })
      .catch(error => {
        // "getToken aborted" ERROR GETS CAUGHT HERE, transaction fails
      })
    }


数据库事务调用

firestore.runTransaction(function(transaction) {

  return transaction.get(usersBusinessRef).then(function(usersBusinesDoc) {

    let claimedPlaces = [];
    if (usersBusinesDoc.exists && usersBusinesDoc.data().claimedPlaces) {
      claimedPlaces = usersBusinesDoc.data().claimedPlaces;
    }
    claimedPlaces.push(claimedPlace);

    return transaction.set(usersBusinessRef, { claimedPlaces }, { merge: true });
  });
});


我在Google的任何地方都找不到错误。

我认为该错误是由登录时发生的令牌更改引起的。另一方面,我正在读取Firebase再接受旧令牌的情况。有什么想法吗?

最佳答案

在调试通过React App连接到Firebase的客户端时,我遇到了类似的错误[错误代码]。

解决方案是

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if false;
    }
  }
}


将上述内容放在firestore设置的规则部分中,这显然意味着您需要允许外部api读取,但写入被阻止,并且以前它同时阻止了读取和写入。

如果您尝试从客户端/服务器读取信息,则可能是问题之一

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write;
    }
  }
}



免责声明:*我不是firebase的专家。我不确定这是否会损害您的数据库以由外部api编写,因为您是通过这样做来打开Firestore防火墙的


附言我认为有一个firebase-admin模块可以通过以单独的方式处理身份验证来帮助进行写操作。我认为该模块更适合写入,而普通的firebase.firestore(app)适用于读取。

07-24 18:31
查看更多