WEBVTT

1
00:00:00.000 --> 00:00:00.953
こんにちは。

2
00:00:00.953 --> 00:00:03.972
今回はルートハンドラーズの使い方です。

3
00:00:03.972 --> 00:00:08.658
ルートハンドラーズは、画面を表示する代わりに、エイチティーティーピーの要望を受けて答えを返す、

4
00:00:08.658 --> 00:00:13.345
サーバー側の仕組みです。

5
00:00:13.345 --> 00:00:20.335
ゲットでエーピーアイの説明を返し、ポストでジェイソンを受け取って検証する流れを学びます。

6
00:00:20.335 --> 00:00:26.054
題材は、送られたメッセージをそのまま返す、小さなエコーエーピーアイです。

7
00:00:26.054 --> 00:00:34.315
前回まで入力を読む側と答えを返す側を別々に学びましたが、今回はその二つを一つのファイルにまとめる回です。

8
00:00:34.315 --> 00:00:37.492
処理の順番に注目しながら聞いてください。

9
00:00:37.492 --> 00:00:39.224
まず置き場所を確認します。

10
00:00:39.224 --> 00:00:43.553
ルートハンドラーは、アップルーターのアプリ、エーピーアイというフォルダーの下に、

11
00:00:43.553 --> 00:00:47.882
ルート・ティーエスというファイルを作って書きます。

12
00:00:47.882 --> 00:00:55.475
ファイルの中では、ゲットやポストといった、エイチティーティーピーのメソッド名と同じ名前の関数をエクスポートします。

13
00:00:55.475 --> 00:01:02.269
この記事の例は、ネクストジェイエス十五以降の書き方に合わせ、タイプスクリプト五・二以降を前提にします。

14
00:01:02.269 --> 00:01:10.661
ページズルーターのエーピーアイルートとは、配置先も書き方も違うため、プロジェクトのルーターとバージョンを先に確認してください。

15
00:01:10.661 --> 00:01:17.055
フォルダーの階層がそのままアドレスになるため、置き場所を間違えるとアクセスしても見つかりません。

16
00:01:17.055 --> 00:01:21.584
ファイル名とフォルダー名は、写し間違いがないか最初に確かめましょう。

17
00:01:21.584 --> 00:01:22.625
基本の形です。

18
00:01:22.625 --> 00:01:28.425
関数は、届いた要望を表すリクエストを受け取り、答えを表すレスポンスを返します。

19
00:01:28.425 --> 00:01:39.729
ウェブ標準の仕組みをそのまま使う書き方で、ページズルーターで使った、リクエストとレスポンスを別々の引数で受け取るデフォルトハンドラーとは形が異なります。

20
00:01:39.729 --> 00:01:46.421
本文を読む処理は時間がかかるため、関数は非同期で書き、結果を待ってから次の判定へ進みます。

21
00:01:46.421 --> 00:01:48.355
受け取る、検証する、返す。

22
00:01:48.355 --> 00:01:52.073
この三段階が、ルートハンドラーの共通の骨組みです。

23
00:01:52.073 --> 00:01:54.899
まずはこの形をしっかり覚えてください。

24
00:01:54.899 --> 00:02:02.484
画面を表示するページのファイルとは役割が分かれていて、このファイルはデータのやり取りだけを担当します。

25
00:02:02.484 --> 00:02:03.990
題材の全体像です。

26
00:02:03.990 --> 00:02:11.523
エーピーアイ、エコーというアドレスにゲットでアクセスすると、エーピーアイの説明が返ります。

27
00:02:11.523 --> 00:02:20.897
ポストでメッセージを送ると、サーバーは内容を検証し、問題がなければ、前後の空白を取り除いたメッセージを返します。

28
00:02:20.897 --> 00:02:28.262
保存処理はなく、送受信を通じてステータスと本文の役割を確認する練習用のエーピーアイです。

29
00:02:28.262 --> 00:02:30.940
失敗の返し方は三種類に分けます。

30
00:02:30.940 --> 00:02:40.816
送り方の形式が違う場合は四百十五、ジェイソンとして読めない場合は四百、値はあるが条件を満たさない場合は四百二十二です。

31
00:02:40.816 --> 00:02:42.606
記事のコード、前半です。

32
00:02:42.606 --> 00:02:47.677
ゲットは引数なしで、サービス名と受け付け形式をジェイソンで返します。

33
00:02:47.677 --> 00:02:56.477
ポストは、まずリクエストのヘッダーからコンテンツタイプを取り出し、セミコロンより前だけを切り取って小文字にそろえます。

34
00:02:56.477 --> 00:03:01.027
これがアプリケーション・スラッシュ・ジェイソンでなければ、ジェイソンで送信してください、

35
00:03:01.027 --> 00:03:05.576
というエラーと四百十五を返します。

36
00:03:05.576 --> 00:03:08.708
そのあと、本文をジェイソンとして読みます。

37
00:03:08.708 --> 00:03:14.824
読み取りは失敗する前提で囲み、失敗したら形式が不正です、と四百を返す点が大切です。

38
00:03:14.824 --> 00:03:19.746
文字の余分な空白を取り除く処理や、大文字と小文字をそろえる処理を挟んでいるのは、

39
00:03:19.746 --> 00:03:24.668
書き方のばらつきで判定がぶれないようにするためです。

40
00:03:24.668 --> 00:03:26.855
コードの後半、入力検証です。

41
00:03:26.855 --> 00:03:34.980
読み取った本文がオブジェクトであること、ヌルでないこと、メッセージという項目があることを順に確かめます。

42
00:03:34.980 --> 00:03:43.260
さらに、メッセージが文字列で、空白だけを取り除いた長さが一以上、元の長さが二百以下であることも確認します。

43
00:03:43.260 --> 00:03:49.978
一つでも外れたら、メッセージは一から二百文字です、というエラーと四百二十二を返します。

44
00:03:49.978 --> 00:03:54.509
すべて通れば、空白を取り除いたメッセージを返し、キャッシュコントロールのノーストアを付けて、

45
00:03:54.509 --> 00:03:59.040
検証つきの応答にします。

46
00:03:59.040 --> 00:04:00.692
動作はカールで試せます。

47
00:04:00.692 --> 00:04:06.269
ローカルホスト三千番のエーピーアイ、エコーへ、コンテンツタイプをアプリケーション・スラッシュ・ジェイソンと指定し、

48
00:04:06.269 --> 00:04:11.845
メッセージに、こんにちは、と入れてポストします。

49
00:04:11.845 --> 00:04:15.976
成功するとエイチティーティーピー二百とメッセージが返ります。

50
00:04:15.976 --> 00:04:20.795
アイというオプションを付けると、ステータスやヘッダーも一緒に見えます。

51
00:04:20.795 --> 00:04:27.610
確認課題として、正常なメッセージ、空文字、不正なジェイソン、別のコンテンツタイプの四パターンを送り、

52
00:04:27.610 --> 00:04:34.426
それぞれのステータスが二百、四百二十二、四百、四百十五になることを自分の目で確かめてみてください。

53
00:04:34.426 --> 00:04:38.419
開発サーバーだけでなく、本番用に組み立てた状態や、公開先でも同じ確認をしておくと、

54
00:04:38.419 --> 00:04:42.412
環境差による失敗に早く気づけます。

55
00:04:42.412 --> 00:04:45.223
三つのエラーを使い分ける考え方です。

56
00:04:45.223 --> 00:04:51.470
四百十五は、ジェイソン以外の形式で送られてきた、という形式そのものの不一致です。

57
00:04:51.470 --> 00:04:57.248
四百は、ジェイソンと名乗っているのに本文が壊れていて読み取れない場合です。

58
00:04:57.248 --> 00:05:01.621
四百二十二は、本文は読めたものの、必須項目がない、型が違う、長さが範囲外といった、

59
00:05:01.621 --> 00:05:05.994
値の条件を満たさない場合です。

60
00:05:05.994 --> 00:05:11.616
どこで失敗したかを分けて返すと、送る側は直すべき場所がすぐに分かります。

61
00:05:11.616 --> 00:05:18.800
エラーの本文には、内部の詳しいエラー情報や秘密の値を出さないことも、あわせて守ってください。

62
00:05:18.800 --> 00:05:20.139
実行環境の注意です。

63
00:05:20.139 --> 00:05:25.762
ネクストジェイエス十五以降、ゲットのルートハンドラーは既定ではキャッシュされません。

64
00:05:25.762 --> 00:05:33.929
ただし設定やデータ取得側のキャッシュは別に存在するため、個別ユーザーの情報を共有キャッシュへ入れないよう注意してください。

65
00:05:33.929 --> 00:05:43.167
また、この例はリクエストごとのサーバー処理を必要とするため、アウトプットにエクスポートを指定した静的ファイルだけの配信では実行できません。

66
00:05:43.167 --> 00:05:48.656
ネクストジェイエスのサーバー実行環境か、別のエーピーアイを用意する必要があります。

67
00:05:48.656 --> 00:05:51.066
動く場所を先に決めることが大事です。

68
00:05:51.066 --> 00:05:57.492
成功応答にノーストアを付けていたのも、検証した結果を古いキャッシュで使い回さないための配慮です。

69
00:05:57.492 --> 00:05:59.116
つまずきやすい点です。

70
00:05:59.116 --> 00:06:06.052
この例のレスポンス・ドット・ジェイソンをタイプスクリプトで使うには、対応する型定義が必要です。

71
00:06:06.052 --> 00:06:12.104
古い構成では、ネクストレスポンス・ドット・ジェイソンを代わりに使う方法があります。

72
00:06:12.104 --> 00:06:18.155
使っている依存のバージョンを、そのまま最新サンプルの環境と思い込まないでください。

73
00:06:18.155 --> 00:06:22.288
実務へ進むときは、今回の検証に加えて、受信サイズの制限、連続アクセスを抑えるレート制限、

74
00:06:22.288 --> 00:06:26.420
認証と認可を追加します。

75
00:06:26.420 --> 00:06:32.914
クッキー認証で更新するエーピーアイなら、シーエスアールエフ対策も一緒に設計してください。

76
00:06:32.914 --> 00:06:41.032
エラーの出し分けはできていても、制限や認証がなければ、大きな本文や大量のリクエストを受け続けてしまうためです。

77
00:06:41.032 --> 00:06:42.059
まとめです。

78
00:06:42.059 --> 00:06:51.647
ルートハンドラーは、アプリ、エーピーアイ配下のルート・ティーエスに、メソッド名の関数をエクスポートして作ります。

79
00:06:51.647 --> 00:06:57.896
ポストの処理では、コンテンツタイプの形式確認、ジェイソンの解析、値の検証の順に進め、

80
00:06:57.896 --> 00:07:04.145
失敗した場所に応じて四百十五、四百、四百二十二を使い分けます。

81
00:07:04.145 --> 00:07:09.453
成功時は空白を取り除いた値を、キャッシュしない設定で返します。

82
00:07:09.453 --> 00:07:14.932
順番に確かめてから返す、この流れが安全なエーピーアイの基本です。

83
00:07:14.932 --> 00:07:18.527
これでルートハンドラーズの基本は完了です。

84
00:07:18.527 --> 00:07:20.068
お疲れさまでした。

85
00:07:20.068 --> 00:07:23.492
次回はレイアウトのプロップスを学びます。
