ノードアプリの実行時に無効なelfヘッダーをbcryptします


87

私は学校のnodejsプロジェクトに取り組んでいます。npmでbcryptをインストールできなかったので、bcrypt-nodejsをインストールしましたが、昨日プロジェクトは正常に機能しました。しかし、今日、「ノードアプリ」を実行すると、次のエラーが発生します。

/.../node_modules/bcrypt/node_modules/bindings/bindings.js:79
        throw e
              ^
Error: /.../node_modules/bcrypt/build/Release/bcrypt_lib.node: invalid ELF header
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at bindings (/.../node_modules/bcrypt/node_modules/bindings/bindings.js:74:15)
    at Object.<anonymous> (/.../node_modules/bcrypt/bcrypt.js:1:97)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)

私のpackage.jsonファイルは次のようになります:

{
  "name": "Supinfarm",
  "version": "0.0.0",
  "env": {
              "PYTHON": "/usr/bin/python2.6"
        },
  "dependencies": {
    "express": "3.1.0",
    "connect-flash": "*",
    "jade": "*",
    "stylus": "*",
    "passport": "*",
    "passport-local": "*",
    "mongoose": "*",
    "bcrypt": "*"
  }
}

私はLinuxubuntu 10.04 LTSを使用していますが、グーグルで解決策を見つけようとしましたが成功しませんでした...誰かが私を助けてくれますか?


解決策を見つけましたか?
MrYoshiji 2013

はい、ubuntu 12.04をインストールし、bcryptをインストールして使用することができました。私の問題に興味を持ってくれてありがとう。
user2244469 2013年

回答:


163

OSXでコンパイルされbcryptはLinuxでは完全に機能しないことがわかりました。つまり、ローカルOSXワークステーションでコンパイルされたbcryptをチェックインし、Linuxサーバーでノードアプリを実行しようとすると、上記のエラーが表示されます。

解決策:npm install bcryptLinuxでは、チェックインして解決しました。

おそらくこれに対処する最善の方法は、.gitignore ...でnode_modulesを除外してnpmをリモートでインストールすることです。


3
これは、それらが異なるオペレーティングシステムであり、おそらく、基盤となるプロセッサアーキテクチャが異なるためです。私が大学にいたとき、2つのUNIXクラスターがありました。1つはVAXで実行され、もう1つはAlphaで実行されていました。CSプロジェクトは...教授が使用したものというのため、VAX上でコンパイルする必要がありました
tkone

@tkoneもちろんですが、npmモジュールはクロスコンパイルされます。バイナリコンポーネントを使用して何かをインストールすると、Mach(OS X)、ELF(Linux)、およびPXE(Windows)バイナリが提供されます。
mikemaccana 2014

1
唯一の問題は次のとおりです。bcryptは、他のノードモジュールとは異なり、単一のOSバイナリのみをインストールします。したがって、node_modules / bcrypt / build / Release / bcrypt_lib.nodeはLinuxバイナリになっているため、LinuxにインストールされたbcryptをコミットするとMac開発者システムが破損しますfile /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeテストするために実行します。
mikemaccana 2014

@mikemaccana彼らは確かにそうしません。開発にはvmwareとubuntuを使用しますが、Macと共有しています。socket.io、leveldb、phantomsjなどはすべて、インストール先のターゲットアーキテクチャ用にコンパイルされます。MacにレベルをインストールしてVMから使用しようとすると、Linuxではなくdarwin用にコンパイルされているため、完全に失敗します。
tkone 2014

2
@mikemaccana node-sassは、(readme.mdから)次の理由でのみ機能しますNode-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:。クロスコンパイルではなく、プリコンパイルされたバイナリを提供します。Node-gypはデフォルトではクロスコンパイルしません。
tkone 2014

13

私のようにDockerコンテナ内で実行している場合、必要なのは「node_modules」が指定された.dockerignoreだけです。

一部のライブラリはホストマシンでコンパイルする必要があるため、モジュールが古くなる可能性があります。


1
これが私の問題でした。bcryptはMacOSX上に構築されましたが、Linuxコンテナーで実行されています。
ネイトリード

7

私の問題はdocker-compose.ymlファイルにあり、.dockerignoreにはすでにnode_modulesがありましたが、node_modulesディレクトリをボリュームとして追加する必要もありました。

volumes:
  - ./:/usr/src/app
  - /usr/src/app/node_modules


6

私はbcryptv.1.0.3でも同じ問題に直面していました。最新バージョン(3.0.1)に更新され、正常に動作するようになりました

実行

npm install bcrypt@latest --save

これで問題は解決しました。ありがとうございます(私はMacOSでプログラミングし、Ubuntuサーバーにデプロイしています!)
Rakshitha Muranga Rodrigo 2018

1
MacOSの中に私のためにこの仕事しない(私はv3.0.4を使用しています)
jordins

1

まず、ノードモジュールをアップロードしておらず、Linuxマシン自体でnpm installを実行していることを確認します。これは、bcryptのインストールが使用するプラットフォームによって異なる場合があるためです。以下の他のプラットフォームの他のインストール手順を見ることができます。
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

さらに問題が発生している場合は、node-pre-gypに関連している可能性があります。bcryptの依存関係。

AWS ElasticBeanstalkの場合Node8.xを実行しているElasticBeanstalkにデプロイする場合、node-gypにはtmpディレクトリに書き込むための十分な権限がありません。bcryptはインストールされず、アプリケーションのデプロイは失敗します。

回避策は、プロジェクトのルートに.npmrcファイルを追加することです。これにより、node-gypがrootとして実行され、インストールが完了します。.npmrcのファイルの内容:

# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5 or @6
unsafe-perm=true

別の方法(おそらくより正しい方法)は、コードを使用して.ebextensionsファイルを作成することです。

.ebextensions:00_change_npm_permissions.config:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/00_set_tmp_permissions.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      chown -R nodejs:nodejs /tmp/.npm

これにより、node-gypを実行するための十分なアクセス権が与えられます


1

この問題を解決するための簡単な方法があります。

1.bcryptをアンインストールします

npm uninstall bcrypt

2.-bcryptを再度インストールします

 npm i bcrypt

このエラーは、bcyptをインストールすると、npmがマシンとオペレーティングシステムに推奨されるバージョンをインストールするために発生しますが、別のマシンを使用している場合、これは機能しません


これは実際に私のために働いた。ありがとう
フランシス

0

AWS Elastic Beanstalkにアプリをデプロイし、サーバーにbcryptをインストールする場合は、デプロイ後のフックに以下を含めます.ebextensions/01_build.config

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_build_app.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      cd /var/app/current/
      rm -rf node_modules/bcrypt
      sudo /opt/elasticbeanstalk/node-install/node-v10.13.0-linux-x64/bin/npm install bcrypt@latest

0

これは少し面倒かもしれませんが、解決策です。Bcryptを実装する必要があるときに行ったことは、Cloud9インスタンスを開始したことです。ご存じない方のために説明すると、Cloud9はEC2インスタンスで実行される基本的なAWSIDEです。Cloud9から、コードをラムダ関数としてIDEにアップロードできます。そこで、Cloud9で関数を作成し、アップロードするとコードが機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.