火力基地在这里
部署您的功能确实需要比我通常愿意等待的时间更多的时间。我们正在努力改进这一点,并且(正如 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;
然后在我的 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
部分)可能有所改变。