経緯
UdemyでNest.jsの講義中にパスワードをハッシュ化させようとbcrypt
をインストールしたらNest.jsが下記のようなエラーを吐き出した。
エラー解法の日本語版がなかったので、作成。
各ミドルウェア
- Docker-Engine: 20.10.2
- node:15.4(元イメージ)
- macOS Catalina 10.15.7(ストレージが足りなくてアップデートできない...)
エラー内容
node:internal/modules/cjs/loader:1167
return process.dlopen(module, path.toNamespacedPath(filename));
^
Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header
at Object.Module._extensions..node (node:internal/modules/cjs/loader:1167:18)
at Module.load (node:internal/modules/cjs/loader:973:32)
at Function.Module._load (node:internal/modules/cjs/loader:813:14)
at Module.require (node:internal/modules/cjs/loader:997:19)
at require (node:internal/modules/cjs/helpers:92:18)
at Object.<anonymous> (/app/node_modules/bcrypt/bcrypt.js:6:16)
at Module._compile (node:internal/modules/cjs/loader:1108:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
at Module.load (node:internal/modules/cjs/loader:973:32)
at Function.Module._load (node:internal/modules/cjs/loader:813:14) {
code: 'ERR_DLOPEN_FAILED'
解決法
参考サイトから、macOS上でインストールしたbcryptはLinuxで動かないことがわかった。
解決法は2通り
- コンテナ上からbcryptライブラリをインストール
- bcryptjsライブラリをインストール
補足
- bcryptjs・・・JSで作られていてbcryptと互換性が有るライブラリ。OSへの依存性はない。
- 特に意識したことがなかったけどbcryptはC++のものをバインディングしているらしい。
- tsで使う場合は、
@type/bcryptjs
も必要