Firebase:如何调用 https.onCall 函数 node.js?

Posted

技术标签:

【中文标题】Firebase:如何调用 https.onCall 函数 node.js?【英文标题】:Firebase: How to call an https.onCall function 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

我做错了什么?

【问题讨论】:

***.com/questions/55883213/…的可能重复 这里有一个类似的问题供您参考***.com/questions/49480761/… @TravisWebb 这不是重复的。错误可能相同,但您链接的问题是尝试在浏览器中运行节点脚本。此处的 OP 正在尝试从浏览器中调用 Cloud Function,在这种情况下,他们需要包含客户端 firebase-functions SDK。 【参考方案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 函数,你可能把事情复杂化了。看到这个答案:***.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 

【讨论】:

以上是关于Firebase:如何调用 https.onCall 函数 node.js?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud 函数中调用导出的 https Firebase Cloud 函数?

Firebase:如何调用 https.onCall 函数 node.js?

Flutter/Firebase:如何减少对推送/弹出调用的 StreamBuilder 调用?

如何在 Firebase 读取 API 中调用 yield

如何在firebase中处理异步调用

如何在 Vue3 中为 Firebase 调用云函数