開始使用:編寫、測試和部署您的第一個函數

要開始使用 Cloud Functions,請嘗試完成本教程,該教程從所需的設置任務開始,並通過創建、測試和部署兩個相關函數進行工作:

  • addMessage()它公開接受文本值,並將其寫入到雲公司的FireStore的URL。
  • makeUppercase()其在雲寫的FireStore和變換文本為大寫觸發器。

我們選擇雲計算公司的FireStore和HTTP觸發JavaScript函數此示例中部分原因是這些背景觸發器可以通過進行徹底的測試火力地堡本地模擬器套房。此工具集還支持實時數據庫、PubSub、Auth 和 HTTP 可調用觸發器。其他類型的背景觸發,例如遠程配置,TestLab和分析觸發器都可以交互測試使用此頁面沒有描述的工具集。

本教程的以下部分詳細介紹了構建、測試和部署示例所需的步驟。如果你寧願只運行代碼並檢查它,跳到評論完整的示例代碼

創建 Firebase 項目

  1. 火力地堡控制台,單擊添加項目,然後選擇或輸入項目名稱

    如果您有現有的 GCP 項目,則可以從下拉菜單中選擇該項目以將 Firebase 資源添加到該項目。

  2. (可選)如果要創建一個新的項目,你可以編輯項目ID。

    Firebase 會自動為您的 Firebase 項目分配一個唯一 ID。參觀了解火力地堡項目,了解火力地堡如何使用項目ID。

  3. 點擊繼續

  4. (可選)設置谷歌分析為您的項目,它使您能夠使用下列任何火力地堡產品的最佳體驗:

    當系統提示,選擇要使用現有的谷歌Analytics帳戶或創建一個新帳戶。
    如果您選擇創建一個新帳戶,選擇您的分析報告位置,然後接受你的項目中的數據共享設置和谷歌Analytics(分析)條款。

  5. 單擊創建項目(或添加火力地堡,如果您使用的是谷歌現有的雲項目)。

Firebase 會自動為您的 Firebase 項目配置資源。該過程完成後,您將轉到 Firebase 控制台中 Firebase 項目的概覽​​頁面。

設置 Node.js 和 Firebase CLI

你需要一個Node.js的環境下寫的功能,你需要的火力地堡CLI部署功能,雲功能運行時。對於安裝的Node.js和NPM節點版本管理建議。

一旦你的Node.js和NPM安裝,安裝火力地堡CLI通過您的首選方法。要通過 npm 安裝 CLI,請使用:

npm install -g firebase-tools

這將安裝全局可用的 firebase 命令。如果命令失敗,則可能需要更改NPM權限。要更新到最新版本firebase-tools ,重新運行相同的命令。

初始化你的項目

當您為 Cloud Functions 初始化 Firebase SDK 時,您會創建一個包含依賴項和一些最少示例代碼的空項目,並選擇 TypeScript 或 JavaScript 來組合函數。就本教程而言,您還需要初始化 Cloud Firestore。

要初始化您的項目:

  1. 運行firebase login通過瀏覽器登錄和驗證火力工具。
  2. 轉到您的 Firebase 項目目錄。
  3. 運行firebase init firestore 。對於本教程,您可以在提示輸入 Firestore 規則和索引文件時接受默認值。如果你還沒有在這個項目中使用雲公司的FireStore的是,你還需要按照說明來選擇啟動方式和位置,公司的FireStore開始使用雲計算公司的FireStore開始
  4. 運行firebase init functions 。該工具為您提供了使用 npm 安裝依賴項的選項。它是安全的下降,如果你想以另一種方式來管理依賴關係,但如果你拒絕,你需要運行npm install模擬或部署你的函數之前。
  5. 該工具為您提供了兩種語言支持選項:

    在本教程中,選擇的JavaScript。

這些命令成功完成後,您的項目結構如下所示:

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

package.json初始化過程中創建的文件中包含一個重要的關鍵: "engines": {"node": "10"} 。這指定了用於編寫和部署函數的 Node.js 版本。您可以選擇其他支持的版本

導入所需的模塊並初始化應用程序

完成設置任務後,您可以打開源目錄並開始添加代碼,如以下部分所述。對於此示例,您的項目必須使用節點導入雲功能和Admin SDK模塊require聲明。添加行類似下面的index.js文件:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

這些線加載firebase-functionsfirebase-admin模塊,並初始化一個admin從該雲的FireStore變化可以由應用程序實例。只要管理SDK的支持是可用的,因為它是FCM,身份驗證和火力地堡實時數據庫,它提供了使用雲功能集成火力地堡的有效途徑。

初始化項目時,Firebase CLI 會自動為 Cloud Functions 節點模塊安裝 Firebase 和 Firebase SDK。要添加第三方庫到你的項目,你可以修改package.json和運行npm install 。欲了解更多信息,請參見手柄的依賴

添加addMessage()函數

對於addMessage()函數,這些行添加到index.js

// Take the text parameter passed to this HTTP endpoint and insert it into 
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin.firestore().collection('messages').add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

addMessage()函數是一個HTTP端點。到終點結果的任何請求ExpressJS風格的請求響應對象傳遞給onRequest()回調。

HTTP的功能是同步的(類似於可調用的函數),所以你應該把盡可能快的響應為使用雲公司的FireStore可能和延遲的工作。該addMessage() HTTP函數經過的路徑下的文本值到HTTP端點並插入它到數據庫/messages/:documentId/original

添加makeUppercase()函數

對於makeUppercase()函數,這些行添加到index.js

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
    .onCreate((snap, context) => {
      // Grab the current value of what was written to Firestore.
      const original = snap.data().original;

      // Access the parameter `{documentId}` with `context.params`
      functions.logger.log('Uppercasing', context.params.documentId, original);
      
      const uppercase = original.toUpperCase();
      
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to Firestore.
      // Setting an 'uppercase' field in Firestore document returns a Promise.
      return snap.ref.set({uppercase}, {merge: true});
    });

makeUppercase()函數執行時雲公司的FireStore寫入。該ref.set函數定義監聽的文檔。出於性能原因,您應該盡可能具體。

括號-例如, {documentId} -surround“參數”通配符暴露在回調其匹配的數據。

雲公司的FireStore觸發onWrite()只要將數據寫入或更新給定文件的回調。

Cloud Firestore 事件等事件驅動的函數是異步的。回調函數返回值應該是一個null ,對象或承諾。如果您不返回任何內容,則該函數將超時,發出錯誤信號並重試。見同步,異步,和承諾

模擬函數的執行

火力地堡本地仿真器套件可讓您部署到火力地堡項目的本地計算機上構建和測試應用程序來代替。強烈建議在開發期間進行本地測試,部分原因是它降低了編碼錯誤的風險,這些錯誤可能會在生產環境中產生成本(例如,無限循環)。

要模擬您的功能:

  1. 運行firebase emulators:start並檢查輸出仿真器套件UI的URL。它默認為本地主機:4000 ,但可能是你的機器上的不同端口上託管。在瀏覽器中輸入該 URL 以打開 Emulator Suite UI。

  2. 檢查的輸出firebase emulators:start為HTTP功能的URL命令addMessage()這將類似於http://localhost:5001/MY_PROJECT/us-central1/addMessage ,不同之處在於:

    1. MY_PROJECT將與您的項目編號來代替。
    2. 您本地機器上的端口可能不同。
  3. 查詢字符串添加?text=uppercaseme給函數的URL的結尾。這應該是這個樣子: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme 。或者,您可以將消息“大寫字母”更改為自定義消息。

  4. 通過在瀏覽器的新選項卡中打開 URL 來創建新消息。

  5. 在 Emulator Suite UI 中查看函數的效果:

    1. 日誌選項卡,你應該看到新的日誌表明函數addMessage()makeUppercase()然:

      i 函數:開始執行“addMessage”

      i 函數:開始執行“makeUppercase”

    2. 公司的FireStore標籤,你應該看到一個包含文件的原始郵件以及郵件的大寫的版本(如果它最初是“uppercaseme”,你會看到“UPPERCASEME”)。

將功能部署到生產環境

一旦您的函數在模擬器中按預期工作,您就可以繼續在生產環境中部署、測試和運行它們。請記住,部署到推薦的Node.js 14的運行環境,你的項目必須在大火定價計劃。見雲功能定價

為了完成本教程中,部署的功能,然後執行addMessage()來觸發makeUppercase()

  1. 運行此命令以部署您的函數:

    $ firebase deploy --only functions
    

    運行此命令後,Firebase CLI 會輸出任何 HTTP 函數端點的 URL。在您的終端中,您應該看到如下一行:

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    URL 包含您的項目 ID 以及 HTTP 函數的區域。雖然你不需要它擔心現在,一些生產HTTP的功能應該指定一個位置,以盡量減少網絡延遲。

    如果遇到訪問錯誤,如“無法授權訪問項目,”請嘗試檢查項目走樣

  2. 使用addMessage()由CLI URL輸出,添加一個文本查詢參數,並在瀏覽器中打開它:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    該函數執行並將瀏覽器重定向到存儲文本字符串的數據庫位置的 Firebase 控制台。這寫事件觸發makeUppercase()它寫入字符串的大寫版本。

部署和執行功能後,您可以查看在火力地堡控制台的雲功能的日誌。如果您需要刪除的功能在開發或生產,使用火力地堡CLI。

在生產中,您可能希望通過設置要運行的最小和最大實例數來優化功能性能和控製成本。見控制縮放行為有關這些運行時選項的詳細信息。

查看完整的示例代碼

下面是完成functions/index.js含有功能addMessage()makeUppercase()這些函數允許您將參數傳遞到 HTTP 端點,該端點將值寫入 Cloud Firestore,然後通過將字符串中的所有字符大寫來轉換它。

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into 
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin.firestore().collection('messages').add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
    .onCreate((snap, context) => {
      // Grab the current value of what was written to Firestore.
      const original = snap.data().original;

      // Access the parameter `{documentId}` with `context.params`
      functions.logger.log('Uppercasing', context.params.documentId, original);
      
      const uppercase = original.toUpperCase();
      
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to Firestore.
      // Setting an 'uppercase' field in Firestore document returns a Promise.
      return snap.ref.set({uppercase}, {merge: true});
    });

下一步

在本文檔中,你可以找到更多的信息,一般的概念雲功能,以及用於引導書寫功能,以處理雲功能支持的事件類型。

要了解有關 Cloud Functions 的更多信息,您還可以執行以下操作:

視頻教程

您可以通過觀看視頻教程了解有關 Cloud Functions 的更多信息。在本視頻中,您將找到有關開始使用 Cloud Functions 的詳細指南,包括 Node.js 和 CLI 設置。