【Next.js】Server Actionでbcryptエラー。Can’t resolve ‘mock-aws-s3’, ‘aws-sdk’,’nock’

こんにちは、フリーランスエンジニアの太田雅昭です。

bcrypt

bcryptは暗号化に用いるライブラリです。ハッシュ化したり、検証したりできます。

Server Actionで使えなかった

Server ActionはNext.jsのサーバー上で実行するコードです。これがどうも、クライアントサイドでも読み込まれてしまっていたのが原因のようです。

試してみたこと

以下のことを試してみました。

  • Server Actionファイルの先頭に”use server”をつける
  • 関数呼び出し後に遅延importする

どれもうまくいきませんでした。原因がどこにあるのか、turbo monorepoが原因なのか、いまいちはっきりわかりません。ただ、同じ症状で悩んでいる方もおられました。

解決策1:bcryptjsを使う

bcryptではなく、bcryptjsを使うことで、Server Actionでも使用することができました。どうやら、bcryptjsはedge環境でも動かすことができるようです。ひとまずこれで、解決しました。

解決策2:routes.tsで書く

もう一つは、ChatGPT大先生に教えていただいた、クライアントと完全に分離するためにAPIとして運用するということです。bcryptの検証機能のみを使用するAPIエンドポイントを作成し、それをServer Actionから利用するといった具合ですね。

こうした手法はmiddlewareなどでも使用されたりします。ただ、面倒です。なぜこれだけのためにAPIエンドポイントを作成し、管理しないといけないのか。はなはだ理不尽です。ともかく今回は、bcryptjsを使うことで解決しましたので、ほっと胸を撫で下ろしています。