TSLab 【第3回 Express勉強会】例外処理
内容
前回はPUTのバリデーション処理を中心に行いましたが今回は実際にPUTでデータの変更をする処理や例外パターンを弾く処理を追加しました。
具体的な内容は下記の通りです。
- 存在しない ID の場合に処理を中断
- 名前が重複する場合に処理を中断
- データの更新確認
存在しないIDの場合に処理を中断
PUTのAPI なので変更する対象が存在しない場合には、処理を中断しエラーを返してあげる必要があります。
- ユーザーが 30 人しかいない (ID:30 まで存在)
- ID:100 のユーザーを変更しようとする
- 当然 ID100 存在しないので変更すること自体が間違い
この場合、行うべき処理は下記の通りです。
- 指定された ID のユーザーをデータベースで検索
- 対象のデータが存在しない場合はエラーを返して処理をスキップ
対象のユーザーを ID で検索
const user = await User.findByPk<User>(this.params.id)
データが存在しない場合はエラーを返し処理をスキップ
if (!user) {
return this.handler.error(NOT_EXIST)
}
上記の処理でユーザーが存在しない場合は処理を中断する事が可能となりました!次にいきましょう!
名前が重複する場合は処理を中断
続いては名前の重複チェックになります。
同一の名前の人が存在しないようにするにはどうする?という話からお試しで追加した内容です。
サービスの仕様によっては必要のない処理だと思います。
処理内容は以下の通りです。
- パラメーターの name でデータベースを検索
- データが存在する(既に同じ名前のユーザーが存在する)場合エラーを返し処理をスキッ
パラメーターのnameでデータベースを検索
const isDuplicateName = await this.checkDuplicateName()
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* nameの重複チェック
**/
async checkDuplicateName(): Promise<boolean> {
if (!this.params.name) return true
const response = await User.findAll({
where: {
name: this.params.name,
id: {
[Op.not]: this.params.id,
},
}
})
return !response.length
}
存在チェックが出来ればいいのでレスポンスは真偽値で返してあげます。
データが存在する場合エラーを返し処理をスキップ
if (isDuplicateName) {
return this.handler.error(DUPLICATE_NAME)
}
データの更新確認
前回の勉強会で行ったバリデーション処理と、今回の例外チェックでイレギュラーハンドリングは完了しました。
最後に実際にデータの更新を行い期待値通りにデータが変更されること、イレギュラーのパラメーターを渡した時に期待のエラーが返ることが確認出来れば PUT API は完成となります!
以下のパターンをチェック出来れば概ね網羅できていると言えますね。
異常系
- id を渡さない場合
- id が文字列の場合
- id が存在しないid の場合
- name が文字列以外の場合
- name が既に存在する名前の場合
- age が数値以外の場合
- id,name,age 以外のパラメーターを渡した場合
正常系
- id で指定したユーザーの name だけが更新される
- id で指定したユーザーの age だけが更新される
- id で指定したユーザーの name,age が更新される
異常系だけでもJestで確認したいですが、今回はPOSTMANで愚直にチェックします。(笑)
さいごに
長くなりましたがここまでやればPUTのAPI は仕上がったと言えますね!
正直 PUT は一番考慮するポイントが多いので、これさえ出来ればPOSTとDELETEは問題なく出来ると思います!
今回まででGET/PUTの処理が完成したので次回はPOST/DELETEを作成して簡単なCLUDのデモを終わろうと思います!
前回の内容が気になる方は下記の記事をご覧くださいませ♪
https://kosotudev.com/tslab-express-2
一緒に勉強会に参加したい方は下記のアカウントをフォローの上ご連絡をお願いします!