cabeçalho elf inválido bcrypt ao executar o aplicativo de nó

87

Estou trabalhando em um projeto nodejs para a escola. Não consegui instalar o bcrypt com o npm, então instalei o bcrypt-nodejs e o projeto funcionou bem ontem. Mas hoje, quando faço um "aplicativo de nó", recebo este erro:

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

meu arquivo package.json tem a seguinte aparência:

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

Estou no Linux ubuntu 10.04 LTS Tentei encontrar uma solução no google sem sucesso ... Alguém pode me ajudar?

user2244469
fonte
Você encontrou uma solução?
MrYoshiji de
sim, instalei o ubuntu 12.04 e consegui instalar e usar o bcrypt. obrigado pelo seu interesse no meu problema.
user2244469

Respostas:

163

Descobri que o bcrypt compilado no OSX não funciona bem no Linux . Em outras palavras, se você verificar o bcrypt compilado em sua estação de trabalho OSX local e tentar executar o aplicativo de nó em seus servidores linux, verá o erro acima.

Solução: npm install bcryptno Linux, verifique isso, resolvido.

Provavelmente, a melhor maneira de lidar com isso é excluir seus node_modules em .gitignore ... e npm instalar remotamente.

Cmag
fonte
3
Isso porque eles são sistemas operacionais diferentes e, muito possivelmente, arquiteturas de processador subjacentes diferentes. Quando eu estava na faculdade, tínhamos dois clusters UNIX: um rodando em VAX e outro em Alpha. Projetos CS teve que ser compilado no VAX já que é o que o professor usados ...
tkone
@tkone Claro, mas os módulos npm compilação cruzada: instalar algo com um componente binário dá a você um binário Mach (OS X), ELF (Linux) e PXE (Windows).
mikemaccana,
1
O único problema é: bcrypt, ao contrário de outros módulos de nó, instala apenas um único binário do sistema operacional. Portanto, comprometer um bcrypt instalado com Linux quebrará seus sistemas de desenvolvedor Mac , uma vez que node_modules / bcrypt / build / Release / bcrypt_lib.node é agora um binário Linux. Execute file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodepara testar.
mikemaccana de
@mikemaccana certamente não. usamos vmware e ubuntu para dev, mas compartilhado com nossos macs. socket.io, leveldb, phantomsj, etc, todos compilam para a arquitetura de destino na qual você está instalando. Se eu instalar o level no meu mac e tentar usá-lo a partir da VM, ele falha completamente, já que foi compilado para darwin e não para Linux.
tkone
2
@mikemaccana nó-sass só funciona porque (a partir do readme.md): Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Não é uma compilação cruzada, mas sim binários pré-compilados. O Node-gyp NÃO faz compilação cruzada por padrão.
tkone
13

Se você estiver executando dentro de um contêiner docker como eu, tudo o que você precisa é um .dockerignore com 'node_modules' especificado nele.

Algumas bibliotecas precisam ser compiladas na máquina host e, portanto, seus módulos podem estar desatualizados.

TacoEater
fonte
1
Esse era o meu problema. bcrypt foi construído no MacOS X, mas rodando em um contêiner Linux.
Nate Reed
7

Meu problema era com meu arquivo docker-compose.yml, eu já tinha node_modules em meu .dockerignore, mas também precisava adicionar o diretório node_modules como um volume:

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

usuario
fonte
6

Eu também estava enfrentando o mesmo problema com o bcrypt v.1.0.3. Acabei de atualizar para a versão mais recente (3.0.1) e está funcionando bem agora

Corre

npm install bcrypt@latest --save
rrt
fonte
Isso resolveu o problema, obrigado, (estou programando em MacOS e implantando no servidor Ubuntu!)
Rakshitha Muranga Rodrigo
1
Isso não funciona para mim (estou usando a v3.0.4) no MacOS
jordins
1

Primeiro, certifique-se de não estar fazendo upload dos módulos de nó e de estar executando o npm install em sua máquina Linux, pois a instalação do bcrypt pode variar dependendo da plataforma que você usa. Você pode ver outras instruções de instalação para outras plataformas abaixo.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Se você estiver tendo mais problemas, pode estar relacionado ao node-pre-gyp. Uma dependência de bcrypt.

Para AWS Elastic Beanstalk Ao implantar no Elastic Beanstalk executando o Node 8.x, o node-gyp não tem permissões suficientes para gravar no diretório tmp. bcrypt não será instalado e a implantação do aplicativo falhará.

Uma solução alternativa é adicionar um arquivo .npmrc à raiz do seu projeto que forçará o node-gyp a ser executado como raiz e permitirá que a instalação seja concluída. Conteúdo do arquivo 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

Outra alternativa (talvez a maneira mais certa) é fazer o arquivo .ebextensions com o 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

Isso lhe dará acesso suficiente para executar node-gyp

sai Kasam
fonte
1

Existe uma maneira simples que me permitiu resolver este problema:

1. Desinstale o bcrypt

npm uninstall bcrypt

2.- Instale o bcrypt novamente

 npm i bcrypt

O erro ocorre porque quando você instala o bcypt, o npm instala a versão recomendada para sua máquina e sistema operacional, mas quando você está em outra máquina, isso não funciona

crazyProgrammer
fonte
Isso realmente funcionou para mim. Obrigado
Francis
0

Para aqueles que implantam um aplicativo para o beanstalk elástico AWS e vão instalar o bcrypt no servidor, inclua em um gancho pós-implantação em .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
fonte
0

Eu sei que isso pode ser um pouco incômodo, mas é uma solução. O que fiz quando precisei implementar o Bcrypt foi iniciar uma instância do Cloud 9. Para aqueles que não sabem, Cloud9 é um AWS IDE básico que roda em uma instância EC2. De Cloud9, você pode fazer upload de seu código no ide como uma função lambda. Então, escrevi a função no Cloud9 e quando fiz o upload, o código funcionou.

Pranjal Chaitanya
fonte