【実例あり!】Expressの基本的なCRUD用ルーティング【Node.js, TypeORM】

Express

みなさんこんにちは、現役エンジニアのサメハックです

未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。

Node.jsの解説シリーズです。

今回はNode.jsライブラリExpressの基本的なルーティングについて学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • Expressの基本的なルーティングが理解できる
  • 実務レベルの実装例が見れる
本記事ではTypeScriptで記述するよ!

【READ】データを取得したい

データを取得する構文

app.get("パス", async(req, res) => {
  // 非同期処理でDBからデータを取得
  res.send(レスポンス)
})
非同期処理を使わない場合はasyncは不要だよ!

実装例

クライアント側

fetchUser(id) {
  const params = { userId: id };
  http.get("/api/user", { params });
}
引数は必ず{ params }というプロパティで渡すよ!

サーバ側

app.get("/user", async(req, res) => {
  // クライアント側から渡したuserIdというパラメータをクエリに設定
  const query = req.query.userId;

  // user.repositoryのgetUser関数を叩く想定
  const response = await db.getUserRepository().getUser(query)

  // ★必要があればこのあたりでデータ成形

  // クライアント側に取得したデータを返す
  res.send(response)
})
SQLは基本的にリポジトリ側で発行されるよ!
リポジトリの取得はgetRepository(Entityのクラス名)でもいいよ!

また、引数は必ずreq.queryというプロパティに格納されているよ!

発行されるURL

http://XXXXXXX/user?userId=渡されたユーザID
ちなみに、ブラウザのURLに直接記述してもデータが取得できるよ!

【UPDATE】データを更新したい

データを更新する構文

app.patch("パス", async(req, res) => {
  // 非同期処理でDBからデータを更新
  res.send(レスポンス)
})

実装例

クライアント側

updateUserName(id, newName) {
  id = 999;
  const params = {name: newName}
  http.delete(`/api/user/update/${id}`);
}

サーバ側

// 渡されたidが数値型であるかをあらかじめ確認
app.patch("/user/update/:id",
  [param("id").isInt()], 
  async (req, res) => {
    // クライアント側から渡したuserIdというパラメータをクエリに設定
    const userId = req.params.id;
    const newUserName = req.body.name;

    // user.idとuserIdが一致するデータ(更新対象)を取得
    const updateTarget = await db.getUserRepository().findOne(userId);
    // 取得したデータのnameカラムの値を更新
    updateTarget.name = newUserName;

    // 新しいデータで既存データを上書き
    await db.getUserRepository().save(updateTarget);

    // 更新が成功したことを通知
    res.status(204).send();
});
これはTypeORMを使っている場合の例だよ!
リポジトリの取得はgetRepository(Entityのクラス名)でもいいよ!

ちなみにfindOneは、Entityファイルで@PrimaryGeneratedColumn
に設定しているカラムの値と一致するかどうかを検索します

WHERE @PrimaryGeneratedColumnのカラム=userId
実際のDBのプライマリーキーかどうかではなく、Entityファイルを参照するので
うまくfindOneが動かないときは、Entityファイルの設定を確認しよう!

発行されるURL

http://XXXXXXX/user/update/渡されたユーザID?name=渡されたユーザ名
ブラウザのURLに直接記述すると404エラーになるよ!

【DELETE】データを削除したい

データを削除する構文

app.delete("パス", async(req, res) => {
    // 非同期処理でDBからデータを削除
    res.send(レスポンス)
})

実装例

クライアント側

deleteUser(id) {
  id = 999;
  http.delete(`/api/user/delete/${id}`);
}

サーバ側

// 渡されたidが数値型であるかをあらかじめ確認
app.delete(
  "/user/delete/:id", 
  [param("id").isInt()], 
  async (req, res) => {
    // クライアント側から渡したuserIdというパラメータをクエリに設定
    const userId = req.params.id;

    // user.idとuserIdが一致するデータ(削除対象)を取得
    const deleteTarget = await db.getUserRepository().findOne(userId);

    // 上の処理で取得したデータを削除
    await db.getUserRepository().remove(deleteTarget)

    // 削除が成功したことを通知
    res.status(204).send();
});
これはTypeORMを使っている場合の例だよ!
リポジトリの取得はgetRepository(Entityのクラス名)でもいいよ!

ちなみにfindOneは、Entityファイルで@PrimaryGeneratedColumn
に設定しているカラムの値と一致するかどうかを検索します

WHERE @PrimaryGeneratedColumnのカラム=userId
実際のDBのプライマリーキーかどうかではなく、Entityファイルを参照するので
うまくfindOneが動かないときは、Entityファイルの設定を確認しよう!

発行されるURL

http://XXXXXXX/user/delete/渡されたユーザID
ブラウザのURLに直接記述すると404エラーになるよ!

まとめ

  • 【CREATE】データの追加: app.post()
  • 【 READ 】データの取得: app.get()
  • 【UPDATE】データの更新: app.patch()※app.put()でも可
  • 【DELETE】データの削除: app.delete()

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

タイトルとURLをコピーしました