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.xcontext.done()
を呼び出して実行を完了する必要があるのに対し、2.x+async
関数では、要求が暗黙的に解決されます。命名規則: 既定では、Azure Functions のファイルを格納するために使用されるフォルダーの名前がエンドポイント名として使用されます (これは function.json でオーバーライドできます)。
構成:HTTP 動詞は、
POST
やPUT
などの 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
を追加することができます。
次のステップ
- 詳細については、対話型チュートリアル「Azure Functions で Node.js と Express API をサーバーレス API にリファクターする」を参照してください。