【问题标题】:Firebase: How to call an https.onCall function node.js?Firebase:如何调用 https.onCall 函数 node.js?
【发布时间】:2020-03-03 08:56:25
【问题描述】:

根据 Firebase 的文档,以下代码可用于调用名为 addMessage 的 onCall 函数。

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({text: messageText}).then(function(result) {
    // Read result of the Cloud Function.
    var sanitizedMessage = result.data.text;
})

我有一个名为 test 的函数,其 Javascript 代码如下(仅用于测试此功能):

exports.test = functions.https.onCall((data, context) => {
  console.log(data);
  data.page++;
  console.log(data);

  var testing = firebase.functions().httpsCallable('test');

  while(data.page < 5) {
    testing({page: data.page}).then(res => {
    console.log("done");
    })
  }
});

但是,在运行此程序时,我收到以下错误:

未处理的错误 TypeError: firebase.functions is not a function

我做错了什么?

【问题讨论】:

标签: javascript node.js firebase google-cloud-platform google-cloud-functions


【解决方案1】:

firebase.functions() 方法来自firebase/functions 包,而不是来自firebasefirebase-functions

const firebase = require('firebase/app');
require('firebase/functions');
const firebaseConfig = {<YOUR_CONFIG_HERE>};
const app = firebase.initializeApp(firebaseConfig);
const functions = app.functions();

【讨论】:

  • 我现在正是这样做的,但是在部署时我收到错误 TypeError: app.functions is not a function
  • 所以我的问题最终与 npm 相关。我删除了我的 package-lock.json 和 node_modules 文件夹并重新安装了所有内容。在那之后,你的答案奏效了!非常感谢
【解决方案2】:

您似乎没有将客户端 Cloud Functions SDK 包含到您的 Web 应用程序中。根据您包含其他 Firebase SDK 的方式,您可能需要执行 what Phani linked to,或将其包含在另一个中(例如 &lt;script src="https://www.gstatic.com/firebasejs/7.2.3/firebase-functions.js"&gt;&lt;/script&gt;)。

setting up your client development environment 上的文档中介绍了该过程。

【讨论】:

  • 我已经包含了firebase和firebase-functions如下:const firebase = require("firebase"); const functions = require('firebase-functions');我也试过firebase.functions().httpsCallable('test');以及functions.httpsCallable('test');总是同样的错误。
  • 我还应该提到,这段代码都在我的 index.js 文件中,位于 firebase 项目的 functions 目录中。据我所知,这不是“web-app”或任何东西,它只是 node.js 中项目的功能。
  • 如果你试图从另一个调用一个 firebase 函数,你可能把事情复杂化了。看到这个答案:stackoverflow.com/a/42787159/3399890
  • @robsiemb 我有同样的问题。如果你想按照微服务的方式来实现你的系统,一般的想法是将系统划分为服务并公开一个 API。就我而言,我也不希望所有 API 都可以直接被客户端使用,并且必须通过中介服务连接它们。在这种情况下,我需要使用 HTTPS 可调用触发器。那么,这可以通过使用 Nodejs 的 Web SDK 来完成吗?
【解决方案3】:

尝试将脚本定义添加到 app.js

scriptInit = (scrName) => {
    const script = document.createElement("script");

    script.src = scrName;
    script.async = false;
    script.type="module"

    document.body.appendChild(script);
}

componentWillMount() {
    this.scriptInit("https://www.gstatic.com/firebasejs/9.1.3/firebase-app.js");
    this.scriptInit("https://www.gstatic.com/firebasejs/9.1.3/firebase-functions.js");
}

对于函数调用,以下工作:

const firebase = require("firebase/app");
const functions = require("firebase/functions");
const firebaseConfig = {FIREBASE_CONFIG};
const app = firebase.initializeApp(FIREBASE_CONFIG);
const functionsFB = functions.getFunctions(app);

return (async () => {
let fbSomeFuncName =  (functions.httpsCallable(functionsFB, 'somefunction'))
            let data = await fbSomeFuncName().then(data=>{return (data.data)}).catch(err=>{console.log("error:"+err)})
return data
// don't forget to add data to the response 

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多