22

今天,Firebase發佈了其全新產品Cloud Functions for Firebase,並且我剛創建了一個Hello World功能並將其部署到我現有的Firebase項目中。如何在PC上本地測試Firebase雲功能

它看起來像捆綁所有依賴關係並將其上傳到firebase,就像aws lambda函數一樣。但即使對代碼進行微小更改也需要花費太多時間,並且還需要良好的互聯網連接。如果你因爲某種原因而離線,那麼只有在你有辦法在本地機器上離線執行和測試這些功能之前,你只是在黑暗中編寫代碼。

有什麼方法可以在本地測試Firebase的雲端函數嗎?

回答

16

這裏

尚未firebaser。有一個雲端函數emulator,但它目前不支持使用Firebase SDK編寫的函數。本地模擬器支持位於我們列表的頂部,我們很快就會有一些東西。

+1

有沒有更新? 謝謝。 –

+3

可用的https功能的Alpha版本firebase模擬器:https://firebase.google。com/docs/functions/local-emulator –

21

firebaser這裏

的功能部署確實需要更多的時間比我通常願意等待。我們正在努力改進它(正如布倫丹所說)正在開發一個本地模擬器。

但目前,我主要是先將我的實際業務邏輯寫入單獨的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 }); 
    }); 
}); 

因此,大家可以看到這最後一個文件是真的只是佈線了「工作人員方法」ocr.extract_text到數據庫位置。

注意這是一個前段時間的項目,所以一些語法(主要是functions.env部分)可能已經發生了一些變化。

+0

可以請你分享任何行動示例或至少指任何包含** hello world program **的任何回購你在回答中描述的內容 –

+0

測試如何在實踐中工作?你提到你在命令行運行'node speech.js'。但是這並不能測試你程序的運行邏輯是否正確?它只測試我猜測的「設置」(即語法,依賴關係等)?如果這是正確的,是否有任何方法可以在本地測試操作邏輯? – Mowzer

+0

我從命令行傳入GCP需要的值。所以它測試我的腳本及其與外部API的交互。如果數據進入雲功能,它不會測試實際流量。 –

7

本地運行

https://firebase.google.com/docs/functions/local-emulator

功能要使用此功能,火力點的工具,必須有最低版本3.8.0, 和firebase功能SDK必須具有最低版本0.5.7。要更新 兩者運行的功能/目錄下面的命令爲您的項目:

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

在本地運行的功能,使用火力服務:

firebase serve --only functions # to only emulate functions 

注意:實驗性的功能。這是一個實驗性功能,目前僅支持仿真HTTPS功能。

UPDATE:

嘿功能信任的測試,

我們剛剛發佈了火力工具V3.11.0,支持一個互動 殼用於模擬各種功能,以及用 測試數據調用它們。感謝你們中的許多人蔘與此功能的反饋 會話。

請參閱我們的文檔以瞭解如何使用這個令人興奮的新功能!

https://firebase.google.com/docs/functions/local-emulator#use_the_cloud_functions_shell

+0

可以做單步法嗎?允許檢查變量的值嗎? –

-1

現在有一個雲functions emulator that讓您調用函數本地

一旦我完成了我的PoC我會更新這個答案,包括代碼,我使用的步驟。

+1

雖然此鏈接可能回答問題,但最好在此處包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/16824425) – Lag

0

首先,我建議你安裝下面的依賴,

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

如果已經安裝,那麼你可以將其更新到最新版本。一般來說,功能仿真器帶有上述的依賴,但我仍然會建議您更新它,

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

一旦它已被更新,去你的應用程序,並運行以下命令的功能文件夾,

firebase serve --only functions 

我希望它有幫助!