如何在PC上本地测试Firebase的云功能

时间:2017-03-10 19:29:51

标签: node.js function firebase google-cloud-functions firebase-cloud-functions

今天Firebase发布了全新的产品Cloud Functions for Firebase,我刚创建了一个hello world功能并将其部署在我现有的firebase项目上。

看起来它捆绑所有依赖项并将其上传到firebase,就像 aws lambda函数一样。但即使在代码的微小变化上也需要太多时间才能完成,并且还需要良好的互联网连接。如果由于某种原因您处于脱机状态,那么在您可以在本地计算机上执行和测试该功能之前,您所处的代码就处于黑暗状态。

有没有办法在本地测试Firebase的云功能?

9 个答案:

答案 0 :(得分:22)

firebaser here

部署你的函数确实比我通常愿意等待的时间更长。我们正在努力改进这一点,并且(正如Brendan所说)正在为当地的模拟器工作。

但目前,我主要是将我的实际业务逻辑写入单独的Node脚本。这样我就可以使用node speech.js从本地命令提示符进行测试。一旦我对该函数的工作感到满意,我将其复制/粘贴到我的实际函数文件中,或者(更好)将speech模块导入到我的函数文件中并从那里调用它。

我快速挖掘的一个简短示例是我使用Cloud Vision API连接文本提取时。我有一个名为ocr.js的文件,其中包含:

var fetch = require('node-fetch');

function extract_text(url, gcloud_authorization) {
  console.log('extract_text from image '+url+' with authorization '+gcloud_authorization);

  return fetch(url).then(function(res) {
    return res.buffer();
  }).then(function(buffer) {
    return fetch('https://vision.googleapis.com/v1/images:annotate?key='+gcloud_authorization, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        "requests":[
          {
            "image":{
              "content": buffer.toString('base64')
            },
            "features":[
              {
                "type":"TEXT_DETECTION",
                "maxResults":1
              }
            ]
          }
        ]
      })
    });
  }).then(function(res) {
    var json = res.json();
    if (res.status >= 200 && res.status < 300) {
      return json;
    } else {
      return json.then(Promise.reject.bind(Promise));
    }
  }).then(function(json) {
    if (json.responses && json.responses.length && json.responses[0].error) {
      return Promise.reject(json.responses[0].error);
    }
    return json.responses[0].textAnnotations[0].description;
  });
}

if (process.argv.length > 2) {
  // by passing the image URL and gcloud access token, you can test this module
  process.argv.forEach(a => console.log(a));
  extract_text(
    process.argv[2], // image URL
    process.argv[3]  // gcloud access token or API key
  ).then(function(description) {
    console.log(description);
  }).catch(function(error) {
    console.error(error);
  });
}

exports.extract_text = extract_text;

然后在我的函数index.js中,我有:

var functions = require('firebase-functions');
var fetch = require('node-fetch');
var ocr = require('./ocr.js');

exports.ocr = functions.database().path('/messages/{room}/{id}').onWrite(function(event) {
  console.log('OCR triggered for /messages/'+event.params.room+'/'+event.params.id);

  if (!event.data || !event.data.exists()) return;
  if (event.data.ocr) return;
  if (event.data.val().text.indexOf("https://firebasestorage.googleapis.com/") !== 0) return; // only OCR images

  console.log(JSON.stringify(functions.env));

  return ocr.extract_text(event.data.val().text, functions.env.googlecloud.apikey).then(function(text) {
    return event.data.adminRef.update({ ocr: text });
  });
});

因此,您可以看到最后一个文件实际上只是将“worker method”ocr.extract_text连接到数据库位置。

请注意,这是一个不久前的项目,所以一些语法(主要是functions.env部分)可能会有所改变。

答案 1 :(得分:17)

firebaser here

要在本地调试Firebase的云功能,有一个模拟器。请参阅documentation for more info

答案 2 :(得分:9)

在本地运行和调试/检查功能

先决条件(google-cloud功能和特定于firebase):

npm install -g @google-cloud/functions-emulator
npm install --save firebase-functions
npm install -g firebase-tools

运行和检查/调试:首先在本地运行函数,然后检查每个函数,最后运行每个特定函数进行调试+检查。使用functions start替代firebase serve并注意每个工具的文档都可用(并且非常有用)。

按预期运行和调试特定函数myFn(例如in Nodejs通过chrome://inspect并注意这可以使用Nodejs v10,但不受官方支持):

firebase serve --only functions
functions inspect myFn
functions call myFn # or call from browser
  

其他文档:

     

https://firebase.google.com/docs/functions/local-emulator   https://cloud.google.com/functions/docs/emulator#debug-emulator   https://github.com/GoogleCloudPlatform/cloud-functions-emulator/wiki

答案 3 :(得分:2)

>>是否可以在本地测试Firebase的云功能?

您可以使用以下命令启动Firebase Shell(在您的functions目录中执行):

npm run build && firebase functions:shell

您可以像这样在shell中调用函数:

helloWorld()

请参阅this链接以获取更多信息。

答案 4 :(得分:1)

在这里回答:https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989

  

Google Cloud Functions也开源了本地模拟器,我们也是   努力与Cloud Functions建立更紧密的集成   火力地堡。同时,你可以在这里查看:   https://github.com/GoogleCloudPlatform/cloud-functions-emulator/

     

模拟器允许您在本地运行函数。这是   解释如何使用它的文档:   https://cloud.google.com/functions/docs/emulator

答案 5 :(得分:1)

一开始我无法执行单步操作。我的过程与此处许多答案中记录的过程相同。

此外,这些页面几乎包含了我需要的所有文档:

我已经使用firebase serve --only functions运行了这些功能,但是没有启动并运行调试器。然后,我遇到了直接使用仿真器的另一种方法,并设法达到了这样的断点:

# start the emulator
functions start

# allow inspection
functions inspect helloWorld

# call the function from the cli
functions call helloWorld

这行得通,我可能会遇到断点。

但是,当在邮递员或浏览器中点击该功能的端点时,我根本没有任何反应。

我所缺少的步骤是:

# deploy the function to the emulator
functions deploy helloWorld --trigger-http

# you need to toggle inspection after the deploy
functions inspect helloWorld

现在,我可以从邮递员或浏览器中找到该函数的端点,并且找到断点。

我推荐出色的NiM chrome extension进行调试,希望这个答案对某人有所帮助,即使这是一个老问题。

答案 6 :(得分:1)

对于vscode用户,调试HTTP函数(webhooks等)...

Google云模拟器(firebase serve --only functions)启动一个单独的进程来运行您的功能。您可以将与vscode这个过程中,但由于模拟器仅创建这个过程中的之后的第一个函数被调用,它不是简单的。

  • 在函数中创建一个虚拟HTTP端点,该端点将返回processID:
app.get("/processid", function(request, response) {
  response.send(`${process.pid}`);
});
  • 使用firebase serve --only functions启动模拟器
  • 调用http://<localhost_url>/processid端点。这将创建过程并返回的ProcessID
  • 使用vscode附加到指定的进程。现在,您可以在其他任何功能上设置断点,步骤等(它们都使用相同的过程)。

可能有更好的方法将所有这些粘合在一起。

答案 7 :(得分:0)

首先,我建议您安装以下依赖项,

npm install --save firebase-functions
npm install -g firebase-tools 

如果已安装,则可以将其更新为最新版本。通常,函数模拟器具有上述依赖性,但我仍然建议您更新它,

npm install -g @google-cloud/functions-emulator

更新后,转到应用程序的functions文件夹并运行以下命令,

firebase serve --only functions

我希望它有所帮助!

答案 8 :(得分:-1)

现在有一个云functions emulator that可让您在本地调用函数

完成我的PoC后,我会更新此答案,以包含我使用过的代码和步骤。