为云函数指定区域时,异常“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-functions
、firebase-admin
和 firebase-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() 需要...无参数...”的主要内容,如果未能解决你的问题,请参考以下文章