У меня есть облачная функция, которая добавляет права администратора для пользователя. Я заставил это работать, но когда я попытался добавить слой обработки ошибок (чтобы исключение не происходило, когда передается электронное письмо, не являющееся зарегистрированным пользователем), я не получил это к работе, и после царапин моя голова в течение нескольких часов, я все еще не могу понять это.
То, что происходит, - то, что этот код всегда возвращает null
, и я думаю, возможно, это как-то связано с результатом checkIfUserWithEmailExists никогда не поворачивается true
.
Это код, который я создал:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.addAdmin = functions.https.onCall(async (data, context) => {
const result = await checkIfUserWithEmailExists(data.email);
if (result === true) {
if (context.auth.token.admin !== true) {
return {
error: "Request not authorized. User must be an admin to fulfill"
};
}
const email_1 = data.email;
return grantAdminRole(email_1).then(() => {
return {
result: `Request fulfilled! ${email_1} is now an admin`
};
});
} else {
return {
error: "No user with this email was found"
};
}
});
async function grantAdminRole(email_2) {
// get user and add custom claim (admin)
const user = await admin.auth().getUserByEmail(email_2);
if (user.customClaims && user.customClaims.admin === true) {
return;
}
return admin.auth().setCustomUserClaims(user.uid, {
admin: true
});
}
//Checks that the email passed in is an existing user
async function checkIfUserWithEmailExists(email) {
const userCollectionRef = admin.firestore().collection("users");
userCollectionRef
.where("email", "==", email)
.get()
.then(querySnapshot => {
if (querySnapshot.size === 1) {
return true;
} else {
return false;
}
});
}