Исключение «firebase.functions () принимает ... без аргументов ...» при указании региона для облачной функции.

Я следую Firebase документация, чтобы вызвать с веб-страницы вызываемую функцию, расположенную в другом регионе, чем us-central1.

Точнее, на веб-странице я использую var functions = firebase.functions('europe-west1');, но получаю следующую ошибку и никакого результата от вызова:

uncaught exception: functions: Firebase: firebase.functions() takes either no argument or a Firebase App instance. (app/invalid-app-argument).

Вот код MCV:

Облачная функция

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

exports.getName = functions
  .region('europe-west1')
  .https.onCall((data, context) => {
    return { name: 'MyName' };
  });

Страница в Интернете

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="https://www.gstatic.com/firebasejs/5.3.1/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.3.1/firebase-functions.js"></script>

</head>

<body>
    <script>
        // Initialize Firebase
        var config = {
            apiKey: "xxxxxxxxxx",
            authDomain: "xxxxxxxxxx",
            databaseURL: "xxxxxxxxxx",
            projectId: "xxxxxxxxxx",
            storageBucket: "xxxxxxxxxx",
            messagingSenderId: "xxxxxxxxxx",
        };
        firebase.initializeApp(config);   

        var functions = firebase.functions('europe-west1');

        var getName = functions.httpsCallable('getName');
        getName().then(function (result) {
            console.log((result.data));
        }).catch(function (error) {
            // Getting the Error details.
            var code = error.code;
            var message = error.message;
            var details = error.details;
        });
    </script>

</body>
</html>

Если я запускаю тот же код в регионе us-central1 (вызывая firebase.functions() без аргументов), он работает правильно.

Облачная функция (версия us-central1)

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

exports.getName = functions  
  .https.onCall((data, context) => {
    return { name: 'MyName' };
  });

Веб-страница (версия us-central1)

<!DOCTYPE html>
<html lang="en">
.....

<body>
    <script>
        // Initialize Firebase
        var config = {
             .....
        };
        firebase.initializeApp(config);

        var functions = firebase.functions();

        ...    

  </script>

</body>
</html>

Обратите внимание, что я обновил свою среду разработки до последних версий firebase-functions, firebase-admin и firebase-tools.

8
0
1 347
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Методом проб и ошибок я обнаружил, что делать это нужно так:

var config = {
            apiKey: "xxxxxxxxxx",
            authDomain: "xxxxxxxxxx",
            databaseURL: "xxxxxxxxxx",
            projectId: "xxxxxxxxxx",
            storageBucket: "xxxxxxxxxx",
            messagingSenderId: "xxxxxxxxxx",
        };
var fireApp = firebase.initializeApp(config);
var functions = fireApp.functions('europe-west1');

Это уже задокументировано здесь: firebase.google.com/docs/functions/locations

Doug Stevenson 10.08.2018 17:29

@DougStevenson Если можно, документация кажется неправильной или неполной. Взгляните на вопрос и код MCV, который реализует то, что сказано в документации, то есть var functions = firebase.functions('europe-west1');, и выдает ошибку.

Renaud Tarnec 10.08.2018 18:19

Он находится прямо в документации под заголовком «Выбор местоположения на стороне клиента для вызываемых функций». Перейдите на вкладку «Интернет», чтобы увидеть код: var functions = firebase.functions('us-central1');

Doug Stevenson 10.08.2018 18:30

Я говорю, что если вы сделаете firebase.initializeApp(config); var functions = firebase.functions('xxxx');, он не сработает. Вероятно, было бы лучше, если бы документ был адаптирован в соответствии с ответом, поскольку нас было как минимум двое, чтобы допустить ошибку.

Renaud Tarnec 10.08.2018 18:33

npm install -g firebase-tools @ latest; npm install firebase-functions @ latest; npm установить firebase-admin @ latest

Denis Truffaut 18.08.2018 23:41

константное приложение = экспресс (); / * ... маршрутизация ... * / export const api = functions.region ('europe-west1'). runWith ({memory: '1GB', timeoutSeconds: 60}). https.onRequest (app);

Denis Truffaut 18.08.2018 23:44

официальный способ сделать это:

var functions = firebase.app().functions('europe-west1');

как указано в документах https://firebase.google.com/docs/functions/locations

Да, в самом деле. Спасибо. На самом деле на момент написания вопроса и ответа документация была неправильной.

Renaud Tarnec 12.12.2019 23:17

зачем нужен '.app ()', так что это путь?

eeerrrttt 16.11.2020 15:28

По какой-то причине у меня был проект, который работал таким образом, но в другом проекте работал только так: var functions = firebase.apps [0] .functions ('europe-west1')

InfoStatus 10.01.2021 11:00

Другие вопросы по теме