API Endpointのエントリポイント・コードの書き方


API Gatewayとかから飛んできたリクエストをLambdaでいい感じに処理する、よくあるバックエンドコード
この辺のいい感じの記述を模索してて最近こんな感じになっています。

最近の自分の書き方

/**
 * フォーマットに関してはこいつに任せる。
 */
const run = async(event, hoehoe) => {
  // どでかいtry-catchで例外をアプリ内に封じ込める
  try {
    // 悩むけどこの辺の情報はこっちでいいかな
    const name = event.pathParameters.name;

    // 処理は極力別クラスに任せる
    const service = new Service(hoehoe);
    const pet =service.getPet(name);

    // 仕様と対応するので正常系の出口は一箇所
    return getSuccessResponse({
      color: pet.color.value,
      size: pet.size || 99999,
    });
  } catch(error) {
    console.error(error);

    // 最低限の整形をしてエラーを通知する。ここはアプリの最終防衛ラインなので重点的にテスト
    return getErrorResponse(error);
  }
} 

/**
 * エントリポイント
 * 外部プラットフォーム依存するコードを集約する
 * ここは結合テストのスコープ(LamndaやAPI Gatewayのテスト機構を使う)
 */
exports.handler = async(event) => {
  return await run(
    event,
    process.env.HOGEHOGE // 環境変数はスコープがでかいので入り口で捕まえて引き回す
  );
};