Как удалить пользователя и его документ Firestore в вызываемой облачной функции

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

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

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

Нужно ли обрабатывать такой крайний случай в приложении / облачных функциях, о чем-то должно заботиться firebase или я просто что-то не так делаю?

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

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 ответ


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

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

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

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

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

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


Есть идеи?

10000