Как удалить пользователя и его документ Firestore в вызываемой облачной функции - PullRequest
1 голос
/ 09 февраля 2020

Я создаю облачную функцию в firebase и мне нужна помощь, я пытаюсь удалить пользовательскую форму firebase и удалить его документ из firestore в одной облачной функции.

Как сделать пакет Работа / транзакция для auth и firestore. Допустим, пользователь пытается удалить свою учетную запись, но по какой-то причине функция user.delete () не работает (скажем, в данный момент она не работает на стороне firebases). Пользователь получит сообщение об ошибке, что мы не сможем удалить его учетную запись, но когда он попытается войти снова, он также получит ошибку, потому что его документ не существует.

Я посмотрел на расширение firebase, чтобы удалить пользовательские данные, но они не удаляют учетную запись пользователя, и, похоже, у них та же проблема.

Нужно ли обрабатывать такой крайний случай в app / cloud-functions? или я просто ошибаюсь?

Вот мой код, если это поможет:

const functions = require("firebase-functions");
const admin = require("firebase-admin");

exports.deleteUser = functions.https.onCall(async (data, context) => {
  try {
    const uid = context.auth.uid;
    const db = admin.firestore();
    const collection = db.collection("users");
    await collection.doc(uid).delete();
    await admin.auth.deleteUser(uid); // what if this line fails?
    return "success";
  } catch (err) {
    console.error(err);
    return "error";
  }
});

1 Ответ

1 голос
/ 09 февраля 2020

Эта строка не делает то, что вы думаете:

const user = await admin.auth().currentUser;

user будет undefined, потому что admin.auth() не имеет свойства с именем currentUser ( это Auth объект). Понятие «текущий пользователь» не существует в бэкэнд-SDK. Это концепция только внешнего интерфейса. Однако у вас есть строка uid, представляющая собой UID аутентифицированного пользователя, который вызвал функцию.

Если вы хотите использовать Firebase Admin SDK для удаления пользователя, идентифицируемого uid string, тогда вам просто нужно позвонить deleteUser (uid) :

await admin.auth().deleteUser(uid);

Кстати, Удалить расширение пользовательских данных не нужно удалять пользователь, потому что он работает, отвечая на удаление пользователем своей учетной записи с помощью клиентского SDK. Этого должно быть достаточно, чтобы заставить это работать.

...