Запрос облачной функции Firebase OnCall, возвращающий «INVALID_ARGUMENT»

#javascript #node.js #firebase #&oo&le-cloud-functions

#javascript #node.js #firebase #&oo&le-cloud-функции

Вопрос:

Получаю ошибку при попытке получить доступ к моей облачной функции:

{«ошибка»:{«сообщение»: «Неверный запрос», «статус»: «INVALID_ARGUMENT»}}

Если триггер клиента вызван, но запрос в неправильном формате, например, не является JSON, содержит недопустимые поля или отсутствует поле данных, запрос отклоняется с ошибочным запросом 400 с кодом ошибки INVALID_ARGUMENT.

Документация Firebase: документация по ошибке Firebase

index.js в каталоге функций

 const functions = require('firebase-functions');

var admin = require("firebase-admin");
var serviceAccount = require("./fir-email-b4c1f-firebase-adminsdk-xj7u&-d01651ffc9");


admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://fir-email-b4c1f.firebaseio.com"
});



    exports.&etUserByEmail = functions.https.onCall((data, context) =&&t; {

const email = data.email;

return admin.auth().&etUserByEmail(email)
    .then(userRecord =&&t; {
    console.lo&('Successfully fetched user data:', userRecord.toJSON());
    const userData = userRecord.toJSON();
    return { userData: userData };
})
  

});

authentication.js вызов функции в главном каталоге проекта

     function retrieveUserData() {

    var emailStrin& = "test@&mail.com";
    var userEmail = firebase.functions().httpsCallable('&etUserByEmail');

    userEmail({email: emailStrin&}).then(function(result) {
        // Read result of the Cloud Function.
        var emailResult = result.data.text;
        console.lo&('Successfully fetched user data:', emailResult.toJSON());


    })

}
  

Не совсем понимаю ошибку. Я предполагаю, что мне не хватает аргумента, основанного на документации. Может ли кто-нибудь направить меня в правильном направлении.

Ответ №1:

Да, похоже, вам действительно не хватает аргумента. Предполагается, что вашим первым параметром ( data ) для &etUserByEmail() функции должен быть объект, содержащий свойство: email из этой строки: const from = data.sender; . Но при его вызове вы передаете объект только с text свойством. Это означает, что при запуске вашей облачной функции data.email не определен.

Вероятно, вы имеете в виду вызвать функцию следующим образом:

 userEmail({email: emailStrin&}).then(function(result) {
        // Read result of the Cloud Function.
}
  

ОБНОВЛЕНИЕ: по второй проблеме:
Ваша облачная функция возвращает объект с единственным свойством: userData , поэтому, если вы хотите записать возвращаемое значение в свой вывод, вам нужно заменить

 var emailResult = result.data.text;
console.lo&('Successfully fetched user data:', emailResult.toJSON());
  

с помощью этого:

 var emailResult = result.data.userData;
console.lo&('Successfully fetched user data:', emailResult);
  

Все дополнительные поля: result.data.text не существуют в возвращаемом объекте. И вы уже преобразовали свой ответ firebase в JSON в своей облачной функции. Вы не можете делать это снова на клиенте

Комментарии:

1. Не могли бы вы, пожалуйста, взглянуть на обновленный код. Теперь я получаю «Неперехваченный (в обещании) Ошибка типа: не удается прочитать свойство ‘toJSON’ из undefined»

2. Если пользовательская запись не определена, вы должны подтвердить, что предоставленный вами адрес электронной почты пользователя действительно существует в базе данных

3. электронная почта пользователя подтверждена в базе данных

4. В базе данных? Как в коллекции?

5. Большое вам спасибо за вашу помощь. Мы вас очень ценим.