はじめに
NestJSはNode.jsのサーバーサイドアプリケーションを効率よく開発するためのフレームワークです。標準でExpress、Fastifyをプラットフォームとしたサーバーが開発可能で、各プラットフォームに対して依存度の低い開発が可能です。生成されるプロジェクトがTypeScriptなのも大きいですね。
NestJSで開発用のプロジェクトを生成するには以下のようにします
$ npm i -g @nestjs/cli
$ nest new project-name
これだけで開発に必要な環境、サンプルコードが自動的に生成されます。NestJSの始め方については本家のFirst Stepなどを参照してください。
今回は、このNestJSを使って簡単なLINE Botエコーサーバーを作ってみようと思います。以前公開したLINE Botサーバーの作り方はFastifyで開発しましたが、だいぶ古くなっているので、現在の技術で再開発してみます。
使ってみる
完成品はこちらです
https://github.com/bathtimefish/line-botserver-example-nestjs/tree/v1
セットアップする
まず、こちらを参考にLINE Developers ConsoleからMessaging APIチャンネルを作成してください。
次に、こちらのようにAWS EC2等でVMインスタンスを立ち上げ、node.jsをセットアップします。
こちらを参考にLet's Encriptでサーバー証明書を作成してください。Bot ServerがLINE PlatformからのWebhookリクエストを受信するためにはSSL証明書を持ったWebサーバーである必要があります。
以上で、下準備ができました。
以下でNestJS Bot Serverのレポジトリをcloneします
git clone -b v1 https://github.com/bathtimefish/line-botserver-example-nestjs
依存モジュールをインストールします
cd line-botserver-example-nestjs
npm i
.envファイルを作成します。SSL_KEY_PATH
にはLet's Encriptで生成したprivkey.pem
のパス、SSL_CERT_PATH
にはfullchain.pem
のパスを設定します。
CHANNEL_ACCESS_TOKEN
にはMessaging APIチャンネルのCHANNEL ACCESS TOKEN、CHANNEL_SECRET
にはCHANNEL SECRETをそれぞれ設定してください。
SSL_KEY_PATH=[YOUR SSL KEY FILE PATH]
SSL_CERT_PATH=[YOUR SSL CERT FILE PATH]
CHANNEL_ACCESS_TOKEN=[YOUR CHANNEL ACCESS TOKEN]
CHANNEL_SECRET=[YOUR CHANNEL SECRET]
設定できたら以下のコマンドでBotサーバーを起動します。
npm run start
以下のようにサーバーが起動します。
npm run start
> line-botserver-example-nestjs@0.0.1 start
> nest start
[Nest] 2825 - 10/29/2023, 6:41:32 AM LOG [NestFactory] Starting Nest application...
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [InstanceLoader] AppModule dependencies initialized +17ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [InstanceLoader] MessagingModule dependencies initialized +0ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [RoutesResolver] AppController {/}: +14ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [RouterExplorer] Mapped {/, GET} route +4ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [RoutesResolver] MessagingController {/messaging}: +0ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [RouterExplorer] Mapped {/messaging, GET} route +0ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [RouterExplorer] Mapped {/messaging, POST} route +1ms
[Nest] 2825 - 10/29/2023, 6:41:33 AM LOG [NestApplication] Nest application successfully started +3ms
最後にこちらを参考にMessaging APIチャンネルのWebhook URLを設定してリクエストの検証をします。今回のWebhook URLは以下のような感じで https://[YOUR_DOMAIN]:3000/messaging
のように設定してください。
Verify
ボタンをクリックすると、以下のようなエラーが発生し、サーバーサイドでも例外Cannot read properties of undefined (reading 'message')
がスローされます。
これはエラーですが、正常に送信されている証拠です。このBot ServerのPostハンドラはWebhookでPostされるリクエストボティがLINE Messaging APIのリクエストボティ構造体かどうかを検証しています。一方で、Verify
ボタンをクリックしたときにPostされるリクエストボディは{}
なので、Bot Server側でLINE Messaging APIのリクエストボティに必須のmessage
プロパティが存在しないという例外が発生しています。
この状態でWebhook URLが妥当だという検証はできているので、LINE ChatでBotに対しメッセージを送るとオウム返しが返ってくるので安心してください。
Botサーバーを開発するたびにそもそもVerify
ボタンで送信されるのが{}
ってどうなのよ。。と思ってるんですが、わかってればクレーム出すほどのもんじゃないのでずっと放置されてるんでしょうか。ダミーのText Message Eventでも送ったほうが親切だと思うんですけどね。
おわりに
NestJSベースのLINE Botサーバーを立ち上げて使ってみました。次回はこのサーバーのコードの要点などを解説していこうと思います。