bcrypt ungültiger Elfen-Header beim Ausführen der Knoten-App

84

Ich arbeite an einem NodeJS-Projekt für die Schule. Ich konnte bcrypt nicht mit npm installieren, also habe ich bcrypt-nodejs installiert und das Projekt hat gestern gut funktioniert. Aber heute, wenn ich eine "Node App" mache, habe ich diesen Fehler:

/.../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)

Meine package.json-Datei sieht folgendermaßen aus:

{
  "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": "*"
  }
}

Ich bin unter Linux Ubuntu 10.04 LTS Ich habe erfolglos versucht, eine Lösung auf Google zu finden ... Kann mir jemand helfen?

user2244469
quelle
Haben Sie eine Lösung gefunden?
MrYoshiji
Ja, ich habe Ubuntu 12.04 installiert und konnte bcrypt installieren und verwenden. Vielen Dank für Ihr Interesse an meiner Ausgabe.
user2244469

Antworten:

163

Ich habe festgestellt, dass unter OSX kompiliertes bcrypt unter Linux nicht ganz funktioniert . Mit anderen Worten, wenn Sie die auf Ihrer lokalen OSX-Workstation kompilierte bcrypt einchecken und versuchen, die Knoten-App auf Ihren Linux-Servern auszuführen, wird der obige Fehler angezeigt.

Lösung: Unter npm install bcryptLinux einchecken, gelöst.

Der wahrscheinlich beste Weg, um damit umzugehen, besteht darin, Ihre node_modules in .gitignore auszuschließen ... und npm remote zu installieren.

Cmag
quelle
2
Das liegt daran, dass es sich um unterschiedliche Betriebssysteme und möglicherweise um unterschiedliche zugrunde liegende Prozessorarchitekturen handelt. Als ich auf dem College war, hatten wir zwei UNIX-Cluster: einen auf einer VAX und einen auf einem Alpha. CS-Projekte mussten auf der VAX kompiliert werden, da dies vom Professor verwendet wurde ...
tkone
@tkone Sicher, aber npm-Module kompilieren sich gegenseitig: Wenn Sie etwas mit einer Binärkomponente installieren, erhalten Sie eine Mach- (OS X), ELF- (Linux) und PXE- (Windows) Binärdatei.
Mikemaccana
1
Das einzige Problem ist: bcrypt installiert im Gegensatz zu anderen Knotenmodulen nur eine einzige Betriebssystem-Binärdatei. Wenn Sie also eine unter Linux installierte bcrypt- Datei festlegen, werden Ihre Mac-Entwicklersysteme beschädigt, da node_modules / bcrypt / build / Release / bcrypt_lib.node jetzt eine Linux-Binärdatei ist. Führen Sie file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodezu testen.
Mikemaccana
@mikemaccana sie sicherlich nicht. Wir verwenden VMware & Ubuntu für Entwickler, teilen sie aber mit unseren Macs. socket.io, leveldb, phantomsj usw. werden alle für die Zielarchitektur kompiliert, auf der Sie installieren. Wenn ich Level auf meinem Mac installiere und versuche, es von der VM aus zu verwenden, schlägt es vollständig fehl, da es für Darwin und nicht für Linux kompiliert wurde.
Tkone
2
@mikemaccana node-sass funktioniert nur, weil (aus der readme.md) : Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Es handelt sich nicht um eine Cross-Kompilierung, sondern um vorkompilierte Binärdateien. Node-gyp wird standardmäßig NICHT crosskompiliert.
Tkone
8

Wenn Sie wie ich in einem Docker-Container ausgeführt werden, benötigen Sie lediglich einen .dockerignore mit den darin angegebenen 'node_modules'.

Einige Bibliotheken müssen auf dem Hostcomputer kompiliert werden, daher können Ihre Module veraltet sein.

TacoEater
quelle
1
Das war mein Problem. bcrypt wurde unter MacOS X erstellt, aber in einem Linux-Container ausgeführt.
Nate Reed
5

Ich hatte auch das gleiche Problem mit bcrypt v.1.0.3. Gerade auf die neueste Version (3.0.1) aktualisiert und funktioniert jetzt einwandfrei

Lauf

npm install bcrypt@latest --save
rrt
quelle
Dies löste das Problem, danke (ich programmiere unter MacOS und stelle es auf dem Ubuntu-Server
bereit
1
Dies funktioniert nicht für mich (ich benutze v3.0.4) in MacOS
Jordanien
5

Mein Problem war mit meiner Datei docker-compose.yml. Ich hatte bereits node_modules in meinem .dockerignore, aber ich musste auch das Verzeichnis node_modules als Volume hinzufügen:

volumes:
  - ./:/usr/src/app
  - /usr/src/app/node_modules
Nick
quelle
1

Stellen Sie zunächst sicher, dass Sie die Knotenmodule nicht hochladen und npm install auf Ihrem Linux-Computer selbst ausführen, da die bcrypt-Installation je nach verwendeter Plattform variieren kann. Weitere Installationsanweisungen für andere Plattformen finden Sie weiter unten.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Wenn Sie weitere Probleme haben, kann dies mit Node-Pre-Gyp zusammenhängen. Eine Abhängigkeit von bcrypt.

Für AWS Elastic Beanstalk Bei der Bereitstellung auf Elastic Beanstalk unter Node 8.x verfügt Node-Gyp nicht über ausreichende Berechtigungen zum Schreiben in das tmp-Verzeichnis. bcrypt wird nicht installiert und die Anwendungsbereitstellung schlägt fehl.

Eine Problemumgehung besteht darin, dem Stammverzeichnis Ihres Projekts eine .npmrc-Datei hinzuzufügen, die die Ausführung von node-gyp als root erzwingt und den Abschluss der Installation ermöglicht. Dateiinhalt für .npmrc:

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

Eine andere Alternative (vielleicht der richtigere Weg) besteht darin, eine .ebextensions-Datei mit Code zu erstellen:

.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

Dadurch erhalten Sie ausreichend Zugriff, um Node-Gyp auszuführen

Sai Kasam
quelle
0

Wenn Sie eine App für AWS Elastic Beanstalk bereitstellen und bcrypt auf dem Server installieren möchten, fügen Sie in einen Post-Deployment-Hook Folgendes ein .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
Carlos Beltran
quelle
0

Es gibt einen einfachen Weg, mit dem ich dieses Problem lösen konnte:

1. Deinstallieren Sie bcrypt

npm uninstall bcrypt

2.- Installieren Sie bcrypt erneut

 npm i bcrypt

Der Fehler tritt auf, weil npm bei der Installation von bcypt die empfohlene Version für Ihren Computer und Ihr Betriebssystem installiert. Wenn Sie sich jedoch auf einem anderen Computer befinden, funktioniert dies nicht

crazyProgrammer
quelle
0

Ich weiß, dass dies ein bisschen mühsam sein könnte, aber es ist eine Lösung. Als ich Bcrypt implementieren musste, habe ich eine Cloud 9-Instanz gestartet. Für diejenigen unter Ihnen, die es nicht wissen, ist Cloud9 eine grundlegende AWS-IDE, die auf einer EC2-Instanz ausgeführt wird. Über Cloud9 können Sie Ihren Code als Lambda-Funktion auf die ide hochladen. Also habe ich die Funktion auf Cloud9 geschrieben und als ich sie hochgeladen habe, hat der Code funktioniert.

Pranjal Chaitanya
quelle