node.js - 如何在 PC 上本地测试 Cloud Functions for Firebase

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

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

看起来它捆绑了所有依赖项并将其上传到 firebase,就像 aws lambda 函数 一样。但即使是代码的微小更改也需要花费太多时间,并且还需要良好的互联网连接。如果您由于某种原因处于离线状态,那么您对正在编写的代码一无所知,直到您有办法在本地计算机上离线执行和测试该功能。

有没有办法在本地测试 Cloud Functions for Firebase?

最佳答案

此处为 firebaser

部署您的功能确实需要比我通常愿意等待的时间更多的时间。我们正在努力改进这一点,并且(正如 Brendan 所说)正在开发本地模拟器。

但目前,我主要是先将实际业务逻辑写入单独的 Node 脚本中。这样我就可以使用 node voice.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;

然后在我的 Functions 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 });
  });
});

正如您所看到的,最后一个文件实际上只是将“工作方法”ocr.extract_text 连接到数据库位置。

请注意,这是一个不久前的项目,因此某些语法(主要是 functions.env 部分)可能已经发生了一些变化。

关于node.js - 如何在 PC 上本地测试 Cloud Functions for Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42895012/

相关文章:

Javascript Bug 调用函数

reactjs - 在 React.JS 中刷新后,如何让用户保持登录到 firebase 的状态?

node.js - 所以我为我的本地主机制作了一个 ssl 证书,但是连接被拒绝,应该怎么办?

javascript - 不公开扩展类方法

node.js - 编写回调的异步/等待版本

javascript - 异步/等待同时避免 Try/Catch block ?

jquery如何给父对象添加属性?

function - Lua 中的三元运算符(函数)

ios - 找不到 Firebase 的 PhoneAuthProvider 类

firebase - 如何在 Firestore 和 Android 中选择位置?