bcrypt en-tête elf non valide lors de l'exécution de l'application de nœud


87

Je travaille sur un projet nodejs pour l'école. Je n'ai pas pu installer bcrypt avec npm alors j'ai installé bcrypt-nodejs et le projet a bien fonctionné hier. Mais aujourd'hui, lorsque je fais une "application de nœud", j'ai cette erreur:

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

mon fichier package.json ressemble à ceci:

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

Je suis sous Linux ubuntu 10.04 LTS J'ai essayé de trouver une solution sur google sans succès ... Quelqu'un peut-il m'aider?


Avez-vous trouvé une solution?
MrYoshiji

oui, j'ai installé ubuntu 12.04 et j'ai pu installer et utiliser bcrypt. merci pour votre intérêt pour ma question.
user2244469

Réponses:


163

J'ai trouvé que bcrypt compilé sur OSX ne fonctionnera pas tout à fait sous Linux . En d'autres termes, si vous archivez le bcrypt compilé sur votre poste de travail OSX local et essayez d'exécuter l'application de nœud sur vos serveurs Linux, vous verrez l'erreur ci-dessus.

Solution: npm install bcryptsous Linux, vérifiez cela, résolu.

La meilleure façon de gérer cela est probablement d'exclure vos node_modules dans .gitignore ... et l'installation de npm à distance.


3
C'est parce que ce sont des systèmes d'exploitation différents, et très probablement, des architectures de processeur sous-jacentes différentes. Quand j'étais à l'université, nous avions deux clusters UNIX: l'un fonctionnant sur un VAX l'autre sur un Alpha. Les projets CS devaient être compilés sur le VAX puisque c'est ce que le professeur a utilisé ...
tkone

@tkone Bien sûr, mais les modules npm se compilent de manière croisée: installer quelque chose avec un composant binaire vous donne un binaire Mach (OS X), ELF (Linux) et PXE (Windows).
mikemaccana

1
Le seul problème est: bcrypt, contrairement aux autres modules de nœuds, n'installe qu'un seul binaire du système d'exploitation. Ainsi, la validation d'un bcrypt installé sous Linux cassera vos systèmes de développement Mac , car node_modules / bcrypt / build / Release / bcrypt_lib.node est maintenant un binaire Linux. Exécutez file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodepour tester.
mikemaccana

@mikemaccana, ce n'est certainement pas le cas. nous utilisons vmware et ubuntu pour le développement, mais partagés avec nos macs. socket.io, leveldb, phantomsj, etc. sont tous compilés pour l'architecture cible sur laquelle vous installez. Si j'installe level sur mon mac et que j'essaie de l'utiliser à partir de la VM, cela échoue complètement car il est compilé pour Darwin et non Linux.
tkone du

2
noeud-SASS de @mikemaccana ne fonctionne que parce que (du readme.md): Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Ce n'est pas une compilation croisée, mais plutôt des binaires pré-compilés. Node-gyp ne fait PAS de compilation croisée par défaut.
tkone le

13

Si vous exécutez à l'intérieur d'un conteneur docker comme je le suis, tout ce dont vous avez besoin est un .dockerignore avec 'node_modules' spécifié dedans.

Certaines bibliothèques doivent être compilées sur la machine hôte et vos modules peuvent donc être obsolètes.


1
C'était mon problème. bcrypt a été construit sur MacOS X mais l'exécute dans un conteneur Linux.
Nate Reed

7

Mon problème concernait mon fichier docker-compose.yml, j'avais déjà node_modules dans mon .dockerignore mais j'avais également besoin d'ajouter le répertoire node_modules en tant que volume:

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


6

J'étais également confronté au même problème avec bcrypt v.1.0.3. Juste mis à jour vers la dernière version (3.0.1) et cela fonctionne correctement maintenant

Courir

npm install bcrypt@latest --save

Cela a résolu le problème, merci, (je programme sur MacOS et le déploie sur le serveur Ubuntu!)
Rakshitha Muranga Rodrigo

1
Cela ne fonctionne pas pour moi (j'utilise la v3.0.4) sous MacOS
jordins

1

Assurez-vous d'abord que vous ne téléchargez pas les modules de nœuds et que vous exécutez npm install sur votre machine Linux elle-même, car l'installation de bcrypt peut varier en fonction de la plate-forme que vous utilisez. Vous pouvez consulter d'autres instructions d'installation pour d'autres plates-formes ci-dessous.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Si vous rencontrez d'autres problèmes, cela pourrait être lié à node-pre-gyp. Une dépendance de bcrypt.

Pour AWS Elastic Beanstalk Lors du déploiement sur Elastic Beanstalk exécutant Node 8.x, node-gyp n'a pas les autorisations suffisantes pour écrire dans le répertoire tmp. bcrypt ne s'installe pas et le déploiement de l'application échoue.

Une solution de contournement consiste à ajouter un fichier .npmrc à la racine de votre projet qui forcera node-gyp à s'exécuter en tant que root et permettra à l'installation de se terminer. Contenu du fichier pour .npmrc:

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

Une autre alternative (peut-être la meilleure façon) est de créer un fichier .ebextensions avec du code:

.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

Cela vous donnera un accès suffisant pour exécuter node-gyp


1

Il existe un moyen simple qui m'a permis de résoudre ce problème:

1. Désinstaller bcrypt

npm uninstall bcrypt

2.- Installez à nouveau bcrypt

 npm i bcrypt

L'erreur se produit car lorsque vous installez bcypt, npm installe la version recommandée pour votre machine et votre système d'exploitation, mais lorsque vous êtes sur une autre machine, cela ne fonctionne pas


Cela a fonctionné pour moi. Merci
Francis

0

Pour ceux qui déploient une application sur AWS Elastic Beanstalk et vont installer bcrypt sur le serveur, incluez dans un hook post-déploiement dans .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

Je sais que cela peut être un peu compliqué, mais c'est une solution. Ce que j'ai fait lorsque j'ai eu besoin de mettre en œuvre Bcrypt, c'est d'avoir démarré une instance Cloud 9. Pour ceux d'entre vous qui ne le savent pas, Cloud9 est un IDE AWS de base qui s'exécute sur une instance EC2. Depuis Cloud9, vous pouvez télécharger votre code sur l'ide en tant que fonction lambda. J'ai donc écrit la fonction sur Cloud9 et quand je l'ai téléchargée, le code fonctionnait.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.