bcrypt intestazione elf non valida durante l'esecuzione dell'app del nodo


87

Sto lavorando a un progetto nodejs per la scuola. Non sono stato in grado di installare bcrypt con npm, quindi ho installato bcrypt-nodejs e il progetto ha funzionato bene ieri. Ma oggi, quando eseguo un "nodo app" ho questo errore:

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

il mio file package.json ha questo aspetto:

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

Sono su Linux ubuntu 10.04 LTS Ho provato a trovare una soluzione su Google senza successo ... Qualcuno può aiutarmi?


Hai trovato una soluzione?
MrYoshiji

sì, ho installato Ubuntu 12.04 e sono stato in grado di installare e utilizzare bcrypt. grazie per il tuo interesse per il mio problema.
user2244469

Risposte:


164

Ho scoperto che bcrypt compilato su OSX non funzionerà del tutto su Linux . In altre parole, se controlli il bcrypt compilato sulla tua workstation OSX locale e provi a eseguire l'app del nodo sui tuoi server Linux, vedrai l'errore sopra.

Soluzione: npm install bcryptsu Linux, controlla, risolto.

Probabilmente il modo migliore per affrontare questo problema è escludere i tuoi node_modules in .gitignore ... e installare npm da remoto.


3
Questo perché sono sistemi operativi diversi e, molto probabilmente, diverse architetture di processori sottostanti. Quando ero al college avevamo due cluster UNIX: uno in esecuzione su un VAX e l'altro su un Alpha. I progetti CS dovevano essere compilati sul VAX poiché è quello che ha usato il professore ...
tkone

@tkone Certo, ma i moduli npm si compilano in modo incrociato: l'installazione di qualcosa con un componente binario ti dà un binario Mach (OS X), ELF (Linux) e PXE (Windows).
mikemaccana

1
L'unico problema è: bcrypt, a differenza di altri moduli del nodo, installa solo un singolo binario del sistema operativo. Quindi il commit di un bcrypt installato su Linux interromperà i tuoi sistemi di sviluppo Mac , poiché node_modules / bcrypt / build / Release / bcrypt_lib.node è ora un binario Linux. Corri file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeper testare.
mikemaccana

@mikemaccana di certo non lo fanno. usiamo vmware e ubuntu per dev, ma condivisi con i nostri mac. socket.io, leveldb, phantomsj, ecc. vengono compilati per l'architettura di destinazione su cui si sta installando. Se installo il livello sul mio Mac e provo a usarlo dalla VM, fallisce completamente poiché è compilato per darwin e non per linux.
tkone

2
@mikemaccana nodo-sass funziona solo perché (dal readme.md): Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Non è cross-compilazione, ma fornisce binari precompilati. Node-gyp NON esegue la compilazione incrociata per impostazione predefinita.
tkone

15

Se stai correndo all'interno di un container docker come me, tutto ciò di cui hai bisogno è un .dockerignore con 'node_modules' specificato al suo interno.

Alcune librerie devono essere compilate sulla macchina host e quindi i moduli possono essere obsoleti.


1
Questo era il mio problema. bcrypt è stato creato su MacOS X ma eseguendolo in un contenitore Linux.
Nate Reed

8

Il mio problema riguardava il mio file docker-compose.yml, avevo già node_modules nel mio .dockerignore ma dovevo anche aggiungere la directory node_modules come volume:

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


6

Stavo anche affrontando lo stesso problema con bcrypt v.1.0.3. Appena aggiornato all'ultima versione (3.0.1) e ora funziona bene

Correre

npm install bcrypt@latest --save

Questo ha risolto il problema, grazie, (sto programmando su MacOS e lo sto implementando sul server Ubuntu!)
Rakshitha Muranga Rodrigo

2
Questo non funziona per me (sto usando v3.0.4) in MacOS
jordins

Questo non funziona per me e sto usando la v5.0.0 in MacOS
therightstuff

1

Per prima cosa assicurati di non caricare i moduli del nodo e di eseguire l'installazione di npm sulla tua macchina Linux, poiché l'installazione di bcrypt può variare a seconda della piattaforma che utilizzi. Puoi guardare altre istruzioni di installazione per altre piattaforme di seguito.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Se hai ulteriori problemi, potrebbero essere correlati a node-pre-gyp. Una dipendenza di bcrypt.

Per AWS Elastic Beanstalk Durante la distribuzione in Elastic Beanstalk che esegue il nodo 8.x, node-gyp non dispone di autorizzazioni sufficienti per scrivere nella directory tmp. bcrypt non si installa e la distribuzione dell'applicazione fallirà.

Una soluzione alternativa consiste nell'aggiungere un file .npmrc alla radice del progetto che forzerà l'esecuzione di node-gyp come root e consentirà il completamento dell'installazione. Contenuto del file per .npmrc:

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

Un'altra alternativa (forse il modo più giusto) è creare un file .ebextensions con il codice:

.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

Questo ti darà accesso sufficiente per eseguire node-gyp


1

C'è un modo semplice che mi ha permesso di risolvere questo problema:

1. Disinstallare bcrypt

npm uninstall bcrypt

2.- Installa di nuovo bcrypt

 npm i bcrypt

L'errore si verifica perché quando installi bcypt, npm installa la versione consigliata per la tua macchina e il tuo sistema operativo, ma quando sei su un'altra macchina, questo non funziona


0

Per coloro che distribuiscono un'app su AWS Elastic beanstalk e installano bcrypt sul server, includere in un hook post-distribuzione in .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

So che potrebbe essere una seccatura, ma è una soluzione. Quello che ho fatto quando avevo bisogno di implementare Bcrypt è stato avviare un'istanza Cloud 9. Per quelli di voi che non lo sanno, Cloud9 è un IDE AWS di base che viene eseguito su un'istanza EC2. Da Cloud9 puoi caricare il tuo codice sull'ide come funzione lambda. Quindi ho scritto la funzione su Cloud9 e quando l'ho caricata, il codice ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.