Nuxt3でExpressを使ってみる

code on a screen NuxtJS
Photo by Markus Spiske on Pexels.com
この記事は約4分で読めます。

はじめに

Nuxt3には、nitro(+h3)というサーバエンジンが標準で備わっているため、server/apiやserver/routeディレクトリにハンドラファイルを置くだけでAPIが簡単に実装できます。しかし、馴染みのあるexpressフレームワークを使いたいという場合もあるのではと思います。

そこで、今回はNuxt3にexpressフレームワークを導入してみます。

Nuxt3とExpressのインストール

まずは、最新のnuxtとexpressをインストールします。

今回の環境は以下のようになっています。

  • macOS 10.15.7
  • NodeJS 16.15.0
  • npm 8.19.2
  • nuxt3 rc11
  • express 4.18.1
 本記事作成時、Nuxt3はまだベータリリースのため動作が変わる可能性もあります。

serverHandlerの作成

nuxt3では、nuxt.config.tsのserverHandlersにハンドラを設定します。今回の設定例は、以下のようになります。/serverというパスに対するリクエストは、/myapi/index.tsのミドルウェアで処理するとします。今回で言えば、expressになります。

ここでの設定は、実際にはh3のミドルウェアとしてマウントされます。h3は、expressやconnectとの互換を最大限に考慮しているとあるので、expressも普通に使えるようです。

routeの記述ついて、h3がradix3というライブラリを内部で使っているのでその記述形式に準じます。

参考リンク

expressの設定

続いてexpressのミドルウェアをserverHandlerとして設定する部分です。

以上でhttp://localhost:3000/server/helloで結果が返るようになるはずです。

試してみると正常に結果を取得できているようです。

2022.10.21 更新

rc12になって、nitro、h3に変更がありました。従来の3argumentsスタイルのハンドラ定義は、以下の関数をラップする形になったようです。

参考:https://github.com/unjs/h3/blob/main/test/integrations.test.ts

node-server向けにビルド

プロダクション向けのビルドでも挙動が問題ないか確認しておきます。同じように結果が返ってきているようです。

APIのエラー時の挙動はどうなるか?

APIでjson形式で結果を取得できるようになりましたが、サーバーエラー時にhtml形式で結果が返ってきてしまいます。どうもエラーページはnitroがハンドルしているようで、nitroのエラーハンドラ内でjsonリクエストであると判断した場合は、content-typeapplication/jsonとして返る?ようです。jsonリクエストであると判断する条件は、以下のようです。

  • ヘッダacceptがapplication/jsonを含む
  • ヘッダuser-agentが、curl/、httpie/を含む
  • リクエストパスが.jsonで終わっている
  • リクエストパスに/api/が含まれる

確認のためwgetとcurlの2つのツールでAPIにアクセスしてみます。curlは、nitroのデフォルトのエラーハンドリングではjsonリクエストとして解釈されるようです。

json形式で受け取りたい場合は、1つの方法として、fetchのリクエストヘッダでacceptを設定すれば良さそう?です。

まだRC版で開発も活発のため変更もあるかもしれませんが、現在の最新版での動作を確認してみました。参考になれば幸いです。

参考リンク

コメント

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