今天Firebase发布了全新的产品Cloud Functions for Firebase,我刚创建了一个hello world功能并将其部署在我现有的firebase项目上。
看起来它捆绑所有依赖项并将其上传到firebase,就像 aws lambda函数一样。但即使在代码的微小变化上也需要太多时间才能完成,并且还需要良好的互联网连接。如果由于某种原因您处于脱机状态,那么在您可以在本地计算机上执行和测试该功能之前,您所处的代码就处于黑暗状态。
有没有办法在本地测试Firebase的云功能?
答案 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这个过程中,但由于模拟器仅创建这个过程中的之后的第一个函数被调用,它不是简单的。
app.get("/processid", function(request, response) {
response.send(`${process.pid}`);
});
firebase serve --only functions
启动模拟器http://<localhost_url>/processid
端点。这将创建过程并返回的ProcessID 可能有更好的方法将所有这些粘合在一起。
答案 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后,我会更新此答案,以包含我使用过的代码和步骤。