为云函数指定区域时,异常“firebase.functions() 需要...无参数...”

Posted

技术标签:

【中文标题】为云函数指定区域时,异常“firebase.functions() 需要...无参数...”【英文标题】:Exception "firebase.functions() takes ... no argument ..." when specifying a region for a Cloud Function 【发布时间】:2018-08-10 13:00:19 【问题描述】:

我正在关注 Firebase documentation,以便从网页调用位于与 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-functionsfirebase-adminfirebase-tools

【问题讨论】:

【参考方案1】:

通过反复试验,我发现您必须这样做:

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 @DougStevenson 如果可以的话,文档似乎是错误的或不完整的。查看问题和实现文档中所述内容的 MCV 代码,即var functions = firebase.functions('europe-west1'); 并给出错误。 它就在文档中“可调用函数的客户端位置选择”标题下。切换到“web”标签查看代码:var functions = firebase.functions('us-central1'); 我的意思是,如果你这样做firebase.initializeApp(config); var functions = firebase.functions('xxxx'); 它是行不通的。如果根据响应调整文档可能会更好,因为我们至少有两个人会犯错误。 npm install -g firebase-tools@latest ; npm install firebase-functions@latest ; npm install firebase-admin@latest【参考方案2】:

官方的做法是:

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

如文档https://firebase.google.com/docs/functions/locations中所述

【讨论】:

确实如此。谢谢。实际上,在撰写问题和答案时,文档是错误的。 为什么需要'.app()',所以这就是方式? 出于某种原因,我有一个项目可以这样工作,但在另一个项目中只能这样工作:var functions = firebase.apps[0].functions('europe-west1')

以上是关于为云函数指定区域时,异常“firebase.functions() 需要...无参数...”的主要内容,如果未能解决你的问题,请参考以下文章

Java内存溢出(OOM)异常完全指南(转)

弯道超车:容器技术究竟为云计算带来了什么?

bitblt函数怎么用啊?

为云 AutoML 导入谷歌云时出错

EXCEL函数中OFFSET表达的是啥意思

17_页面异常接管