У меня есть функция Google Cloud, которую я вызываю из моего приложения RN, но она возвращает
[Ошибка: внутренняя]
Я установил разрешение на Неаутентифицированные пользователи , чтобы каждый мог его вызвать - только для целей тестирования. Когда я устанавливаю разрешение «Аутентифицированные пользователи», оно выдает еще одну ошибку [Ошибка: не аутентифицирована], хотя я аутентифицирован и могу получить идентификатор currentUser в своем приложении.
Попытка поиска этой ошибки, но она не привела меня к каким-либо возможным решениям, поэтому решил опубликовать здесь и, надеюсь, получить ответы, которые помогут мне исправить ее.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.createUser = functions.region('europe-west1').https.onCall(async (data, context) => {
try {
//Checking that the user calling the Cloud Function is authenticated
if (!context.auth) {
throw new UnauthenticatedError('The user is not authenticated. Only authenticated Admin users can create new users.');
}
const newUser = {
email: data.email,
emailVerified: false,
password: data.password,
disabled: false
}
const role = data.role;
const userRecord = await admin
.auth()
.createUser(newUser);
const userId = userRecord.uid;
const claims = {};
claims[role] = true;
await admin.auth().setCustomUserClaims(userId, claims);
return { result: 'The new user has been successfully created.' };
} catch (error) {
if (error.type === 'UnauthenticatedError') {
throw new functions.https.HttpsError('unauthenticated', error.message);
} else if (error.type === 'NotAnAdminError' || error.type === 'InvalidRoleError') {
throw new functions.https.HttpsError('failed-precondition', error.message);
} else {
throw new functions.https.HttpsError('internal', error.message);
}
}
});
в моем приложении RN я называю это так:
var user = {
role: role
}
const defaultApp = firebase.app();
const functionsForRegion = defaultApp.functions('europe-west1');
const createUser = await functionsForRegion.httpsCallable('createUser');
createUser(user)
.then((resp) => {
//Display success
});
console.log(resp.data.result);
})
.catch((error) => {
console.log("Error on register patient: ", error)
});
Я думаю, способ, которым я называю его в моем приложении RN, правильный, потому что я проверил его с помощью testFunction и я вернул простую строку. Итак, я считаю, что проблема где-то в самой функции.
РЕДАКТИРОВАТЬ: Я только что проверил, просто вызывая функцию и возвращая контекст, и он всегда возвращает внутреннюю ошибку:
exports.registerNewPatient = functions.region('europe-west3').https.onCall((data, context) => {
return context; //this is returned as INTERNAL error.
}
Я просто не могу понять, что происходит здесь, почему он возвращает Внутреннюю ошибку, когда я аутентифицируюсь как пользователь, и он должен возвращать аутентифицированные пользовательские данные, не так ли?