每次创建新用户时触发云功能

时间:2019-12-04 05:04:18

标签: reactjs firebase firebase-realtime-database react-redux firebase-authentication

我正在使用react-redux-firebase框架(http://react-redux-firebase.com/docs/auth.html)。我部署了一个在functions.auth.user().oncreate事件上触发的功能。流程如下:

  1. 用户登录
  2. 在我的users集合中创建了用于用户的文档
  3. 功能触发并在Google添加的默认字段之上将字段添加到用户文档中

这正在工作。

然后,我在user集合上实现了CRUD函数。当我通过用户界面中已实现的CRUD功能删除用户文档时,它会成功从Firestore中删除。但是,当我重新与用户重新登录时,它将重新创建用户文档,但是仅使用默认的google字段,它不会再次重新触发该功能。

Google似乎记得谁曾经登录过,.onCreate仅在新登录时触发。

要使功能再次触发,我必须进入Firebase仪表板并从身份验证表中删除用户,然后重新登录。

firebase dashboard delete in menu

如何确保.onCreate会在users集合上触发,而不是在Firebase身份验证上触发?

2 个答案:

答案 0 :(得分:1)

onCreate在身份验证触发器的上下文中应有的表现。它仅在创建新用户时触发。当您使用同一用户重新登录时,您不会创建新用户,因此不会触发该功能。您只删除数据库中的用户,而不删除Firebase身份验证中的用户。

如果要基于在集合中创建的用户文档触发功能,则需要编写数据库功能。根据您存储用户数据的位置,这将需要是实时数据库或Firestore触发器。

因此,如果您希望函数在每次在Firestore中创建用户文档时都触发,则它看起来像这样:

exports.updateUser = functions.firestore
    .document('users/{userId}')
    .onCreate((change, context) => {
      // Your logic
    });

或者,实时数据库触发器看起来类似,但是您将 firestore 替换为 database 。所以...

exports.updateUser = functions.database.ref('users/{userId}')
    .onCreate((snap, context) => {
      // Your logic
    });

您不仅限于在创建时触发,还可以在更新,写入和删除时触发。

这里是Firestore Triggers上的相关文档

以下是Real time DB Triggers

上的文档

答案 1 :(得分:1)

根据您的描述,您并不会删除用户本身,而只是删除存储在Cloud Firestore中的用户数据。正确删除用户后,它将触发您设置的所有onDelete authentication functions

要使用客户端代码删除用户,您需要使用:

firebase.auth().currentUser.delete()
  .then(function() {
    console.log('Successfully deleted user');
  })
  .catch(function(error) {
    console.log('Error deleting user:', error);
  });

如果要从Cloud Functions中删除用户,请改用:

admin.auth().deleteUser(uid) // maybe get uid from the deleted document ID?
  .then(function() {
    console.log('Successfully deleted user');
  })
  .catch(function(error) {
    console.log('Error deleting user:', error);
  });