bcrypt encabezado elf no válido al ejecutar la aplicación de nodo

87

Estoy trabajando en un proyecto de nodejs para la escuela. No pude instalar bcrypt con npm, así que instalé bcrypt-nodejs y el proyecto funcionó bien ayer. Pero hoy, cuando hago una "aplicación de nodo", tengo este error:

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

mi archivo package.json se ve así:

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

Estoy en Linux ubuntu 10.04 LTS He tratado de encontrar una solución en Google sin éxito ... ¿Alguien puede ayudarme?

usuario2244469
fuente
¿Encontraste una solución?
MrYoshiji
sí, instalé ubuntu 12.04 y pude instalar y usar bcrypt. gracias por tu interés en mi tema.
user2244469

Respuestas:

163

Descubrí que bcrypt compilado en OSX no funciona del todo en Linux . En otras palabras, si verifica el bcrypt compilado en su estación de trabajo OSX local e intenta ejecutar la aplicación de nodo en sus servidores Linux, verá el error anterior.

Solución: npm install bcrypten Linux, verifique eso, resuelto.

Probablemente la mejor manera de lidiar con esto es excluir sus node_modules en .gitignore ... y npm instalar de forma remota.

Cmag
fuente
3
Eso es porque son diferentes sistemas operativos y, muy posiblemente, diferentes arquitecturas de procesador subyacentes. Cuando estaba en la universidad teníamos dos clústeres de UNIX: uno se ejecutaba en un VAX y el otro en un Alpha. Los proyectos de CS TENÍAN que compilarse en el VAX ya que eso es lo que usó el profesor ...
tkone
@tkone Seguro, pero los módulos npm se compilan de forma cruzada: la instalación de algo con un componente binario le da un binario Mach (OS X), ELF (Linux) y PXE (Windows).
Mikemaccana
1
El único problema es: bcrypt, a diferencia de otros módulos de nodo, solo instala un único sistema operativo binario. Por lo tanto, confirmar un bcrypt instalado en Linux romperá los sistemas de desarrollo de Mac , ya que node_modules / bcrypt / build / Release / bcrypt_lib.node ahora es un binario de Linux. Ejecutar file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodepara probar.
Mikemaccana
@mikemaccana ciertamente no lo hacen. usamos vmware y ubuntu para desarrollo, pero lo compartimos con nuestras macs. socket.io, leveldb, phantomsj, etc., se compilan para la arquitectura de destino en la que está instalando. Si instalo level en mi mac e intento usarlo desde la máquina virtual, falla completamente ya que está compilado para darwin y no para linux.
tkone
2
@mikemaccana nodo-Sass sólo funciona debido a que (desde el readme.md): Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. No es una compilación cruzada, sino que le brinda binarios precompilados. Node-gyp NO realiza una compilación cruzada de forma predeterminada.
tkone
13

Si está ejecutando dentro de un contenedor docker como yo, todo lo que necesita es un .dockerignore con 'node_modules' especificado en él.

Algunas bibliotecas deben compilarse en la máquina host y, por lo tanto, sus módulos pueden quedar obsoletos.

TacoEater
fuente
1
Este era mi problema. bcrypt se creó en MacOS X pero se ejecuta en un contenedor de Linux.
Nate Reed
7

Mi problema fue con mi archivo docker-compose.yml, ya tenía node_modules en mi .dockerignore pero también necesitaba agregar el directorio node_modules como un volumen:

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

Mella
fuente
6

También me enfrentaba al mismo problema con bcrypt v.1.0.3. Recién actualizado a la última versión (3.0.1) y ahora funciona bien

correr

npm install bcrypt@latest --save
rrt
fuente
Esto resolvió el problema, gracias (¡estoy programando en MacOS y lo estoy implementando en el servidor Ubuntu!)
Rakshitha Muranga Rodrigo
1
Esto no funciona para mí (estoy usando v3.0.4) en MacOS
jordins
1

Primero asegúrese de que no está cargando los módulos de nodo y está ejecutando npm install en su propia máquina Linux, ya que la instalación de bcrypt puede variar según la plataforma que utilice. Puede consultar otras instrucciones de instalación para otras plataformas a continuación.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Si tiene más problemas, podría estar relacionado con node-pre-gyp. Una dependencia de bcrypt.

Para AWS Elastic Beanstalk Cuando se implementa en Elastic Beanstalk con Node 8.x, node-gyp no tiene permisos suficientes para escribir en el directorio tmp. bcrypt no se instalará y la implementación de la aplicación fallará.

Una solución alternativa es agregar un archivo .npmrc a la raíz de su proyecto que forzará a node-gyp a ejecutarse como root y permitirá que se complete la instalación. Contenido del archivo para .npmrc:

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

Otra alternativa (quizás la forma más correcta) es hacer un archivo .ebextensions con código:

.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

Esto le dará suficiente acceso para ejecutar node-gyp

sai kasam
fuente
1

Hay una forma sencilla que me permitió resolver este problema:

1. Desinstale bcrypt

npm uninstall bcrypt

2.- Instala bcrypt nuevamente

 npm i bcrypt

El error se produce porque cuando instala bcypt, npm instala la versión recomendada para su máquina y sistema operativo, pero cuando está en otra máquina, esto no funciona

loco programador
fuente
Esto realmente funcionó para mí. Gracias
Francis
0

Para aquellos que implementan una aplicación en AWS elastic beanstalk y van a instalar bcrypt en el servidor, incluya en un enlace posterior a la implementación en .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 Beltrán
fuente
0

Sé que esto puede ser un poco complicado, pero es una solución. Lo que hice cuando necesitaba implementar Bcrypt fue iniciar una instancia de Cloud 9. Para aquellos de ustedes que no lo saben, Cloud9 es un AWS IDE básico que se ejecuta en una instancia EC2. Desde Cloud9 puede cargar su código en el ide como una función lambda. Así que escribí la función en Cloud9 y cuando la cargué, el código funcionó.

Pranjal Chaitanya
fuente