Share via


Express.js を Azure Functions に切り替える

Express.js は、Web 開発者の間で最も支持されている Node.js フレームワークの 1 つであり、API エンドポイントを提供するアプリの構築に最適な選択肢であり続けています。

コードをサーバーレス アーキテクチャに移行する際、Express.js のエンドポイントをリファクターすると次の領域に影響が及びます。

  • ミドルウェア: Express.js は、堅牢なミドルウェア群を特徴としています。 Azure Functions と Azure API Management の機能から、ミドルウェア モジュールはその多くが不要となります。 重要なミドルウェアによって処理されるロジックは、エンドポイントを移行する前に複製するか、置き換えるようにしてください。

  • 異なる API: 要求と応答の両方を処理するために使用される API が Azure Functions と Express.js とでは異なります。 必要な変更については、以下の例で詳しく取り上げます。

  • 既定のルート: 既定では、Azure Functions のエンドポイントが api ルートで公開されます。 ルーティング規則は、host.json ファイル内の routePrefix で構成できます。

  • 構成と規則: 関数アプリでは、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 に送信されると、Success を含んだ HTTP 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 でオーバーライドできます)。

  • 構成:HTTP 動詞は、POSTPUT などの function.json ファイルで定義します。

次の 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 を追加することができます。

次のステップ