Получение [Ошибка: Внутренняя] в приложении RN при запуске облачной функции - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть функция 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. 
}

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

1 Ответ

0 голосов
/ 23 апреля 2020

Попробуйте некоторые console.log(context) ; console.log(data) операторы в вашей функции registerNewPatient и посмотрите журналы. Что они говорят?

Некоторые другие факторы, которые следует учитывать, могут включать в себя то, что в вашем клиентском коде вы используете europe-west1, а в коде вашей функции europe-west3. Попробуй собрать эти строки и посмотреть, работает ли это? По моему опыту, если указанная функция не найдена, клиент получает ВНУТРЕННЮЮ ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...