11
2

More than 3 years have passed since last update.

macOS + Docker + Node.js で bcryptが使えない。

Posted at

経緯

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通り
1. コンテナ上からbcryptライブラリをインストール
2. bcryptjsライブラリをインストール

補足

  • bcryptjs・・・JSで作られていてbcryptと互換性が有るライブラリ。OSへの依存性はない。
  • 特に意識したことがなかったけどbcryptはC++のものをバインディングしているらしい。
  • tsで使う場合は、@type/bcryptjsも必要

参考

  1. https://stackoverflow.com/questions/15809611/bcrypt-invalid-elf-header-when-running-node-app
  2. https://www.npmjs.com/package/bcryptjs
11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2