みなさんこんにちは、現役エンジニアのサメハックです
未経験から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というプロパティに格納されているよ!
リポジトリの取得は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のクラス名)でもいいよ!
リポジトリの取得はgetRepository(Entityのクラス名)でもいいよ!
ちなみにfindOneは、Entityファイルで@PrimaryGeneratedColumn
に設定しているカラムの値と一致するかどうかを検索します
WHERE @PrimaryGeneratedColumnのカラム=userId
実際のDBのプライマリーキーかどうかではなく、Entityファイルを参照するので
うまくfindOneが動かないときは、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のクラス名)でもいいよ!
リポジトリの取得はgetRepository(Entityのクラス名)でもいいよ!
ちなみにfindOneは、Entityファイルで@PrimaryGeneratedColumn
に設定しているカラムの値と一致するかどうかを検索します
WHERE @PrimaryGeneratedColumnのカラム=userId
実際のDBのプライマリーキーかどうかではなく、Entityファイルを参照するので
うまくfindOneが動かないときは、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フォローしてもらえると嬉しいです🦈