從 Express.js 移轉至 Azure Functions

Express.js 是 Web 開發人員最熱門的Node.js 架構之一,而且是建置提供 API 端點的應用程式的絕佳選擇。

將程式碼移轉至無伺服器架構時,重構 Express.js 端點會影響下列區域:

  • 中介軟體:Express.js 具有強固的中介軟體集合。 在 Azure Functions 和 Azure API 管理功能中,不再需要許多中介軟體模組。 在移轉端點之前,請確保您可以複寫或取代基本中介軟體所處理的任何邏輯。

  • 不同的 API:用來處理要求和回應的 API 在 Azure Functions 和 Express.js 之間有所不同。 下列範例詳細說明必要的變更。

  • 預設路由:依預設,Azure Functions 端點會在 api 路由下公開。 路由規則可透過host.json 檔案中的 routePrefix 設定

  • 組態和慣例:Functions 應用程式會使用 function.json 檔案來定義 HTTP 動詞、定義安全性原則,以及設定函式的輸入和輸出。 依預設,包含函式檔案的資料夾名稱會定義端點名稱,但您可以透過 function.json 檔案中的 route 屬性來變更名稱。

提示

若要深入了解,請參閱使用 Azure Functions 將 Node.js 和 Express API 重構為無伺服器 API 互動式教學課程。

範例

Express.js

下列範例顯示典型的 Express.js GET 端點。

// server.js
app.get('/hello', (req, res) => {
  try {
    res.send("Success!");
  } catch(error) {
    const err = JSON.stringify(error);
    res.status(500).send(`Request error. ${err}`);
  }
});

GET 要求傳送至 /hello 時,會傳回包含 SuccessHTTP 200 回應。 如果端點遇到錯誤,回應會是 HTTP 500 並具有錯誤詳細資料。

Azure Functions

Azure Functions 會將組態和程式碼檔案組織成每個函式單一資料夾。 依預設,資料夾的名稱會指出函式名稱。

例如,名為 hello 的函式有具有下列檔案的資料夾。

| - hello
|  - function.json
|  - index.js

下列範例會實作與上述 Express.js 端點相同的結果,但使用 Azure Functions。

// hello/index.js
module.exports = async function (context, req) {
  try {
    context.res = { body: "Success!" };
  } catch(error) {
    const err = JSON.stringify(error);
    context.res = {
      status: 500,
      body: `Request error. ${err}`
    };
  }
};

移至 Functions 時,會進行下列變更:

  • 模組:函式程式碼會實作為 JavaScript 模組。

  • 內容和回應物件context 可讓您與 Functions 的執行階段通訊。 您可以從內容讀取要求資料,並設定函式的回應。 同步程式碼會要求您呼叫 1.x context.done() 來完成執行,而 2.x+ async 函式則會隱含地解析要求。

  • 命名慣例:用來包含 Azure Functions 檔案的資料夾名稱預設會作為端點名稱 (您可以在 function.json 中覆寫此名稱)。

  • 組態:您可以在 function.json 檔案中定義 HTTP 動詞命令,例如 POSTPUT

下列 function.json 檔案會保存函式的組態資訊。

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["get"]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ]
}

藉由在 methods 陣列中定義 get,函式就可供 HTTP GET 要求使用。 如果您想要讓 API 接受支援 POST 要求,也可以將 post 新增至陣列。

下一步