bcrypt nieprawidłowy nagłówek elf podczas uruchamiania aplikacji węzła

87

Pracuję nad projektem nodejs dla szkoły. Nie mogłem zainstalować bcrypt z npm, więc zainstalowałem bcrypt-nodejs i projekt wczoraj działał dobrze. Ale dzisiaj, kiedy wykonuję „aplikację węzła”, mam ten błąd:

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

mój plik package.json wygląda następująco:

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

Jestem na Linuksie Ubuntu 10.04 LTS Próbowałem znaleźć rozwiązanie w Google bez powodzenia ... Czy ktoś może mi pomóc?

user2244469
źródło
Znalazłeś rozwiązanie?
MrYoshiji
tak, zainstalowałem Ubuntu 12.04 i mogłem zainstalować i używać bcrypt. dziękuję za zainteresowanie moim wydaniem.
user2244469

Odpowiedzi:

164

Odkryłem, że bcrypt skompilowany na OSX nie będzie działał na Linuksie . Innymi słowy, jeśli zaznaczysz plik bcrypt skompilowany na lokalnej stacji roboczej OSX i spróbujesz uruchomić aplikację węzła na serwerach linuxowych, zobaczysz powyższy błąd.

Rozwiązanie: npm install bcryptw systemie Linux sprawdź to, rozwiązane.

Prawdopodobnie najlepszym sposobem rozwiązania tego problemu jest wykluczenie modułów node_modules w .gitignore ... i zdalna instalacja npm.

Cmag
źródło
3
Dzieje się tak, ponieważ są to różne systemy operacyjne i całkiem możliwe, że są to różne podstawowe architektury procesorów. Kiedy byłem na studiach, mieliśmy dwa klastry UNIX: jeden działał na VAX, a drugi na Alpha. Projekty CS musiały zostać skompilowane na VAX
ie,
@tkone Jasne, ale moduły npm kompilują się krzyżowo: instalacja czegoś z komponentem binarnym daje binarny Mach (OS X), ELF (Linux) i PXE (Windows).
mikemaccana
1
Jedynym problemem jest to, że bcrypt, w przeciwieństwie do innych modułów węzłów, instaluje tylko jeden plik binarny systemu operacyjnego. Tak więc zatwierdzenie bcrypt zainstalowanego w Linuksie zepsuje systemy deweloperskie Maca , ponieważ node_modules / bcrypt / build / Release / bcrypt_lib.node jest teraz plikiem binarnym Linux. Uruchom, file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeaby przetestować.
mikemaccana
@mikemaccana na pewno nie. używamy vmware i ubuntu dla deweloperów, ale udostępniamy je naszym komputerom Mac. socket.io, leveldb, phantomsj itp. kompilują się dla docelowej architektury, na której instalujesz. Jeśli zainstaluję poziom na moim Macu i spróbuję go użyć z maszyny wirtualnej, to całkowicie się nie powiedzie, ponieważ jest skompilowany dla Darwina, a nie dla Linuksa.
tkone,
2
@mikemaccana node-Sass działa tylko dlatego, że (z readme.md) Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Nie jest to kompilacja krzyżowa, a raczej dostarczanie wstępnie skompilowanych plików binarnych. Node-gyp domyślnie NIE kompiluje krzyżowo.
tkone,
15

Jeśli tak jak ja korzystasz z kontenera Dockera, potrzebujesz tylko pliku .dockerignore z określonym w nim „node_modules”.

Niektóre biblioteki muszą zostać skompilowane na komputerze hosta, dlatego moduły mogą być nieaktualne.

TacoEater
źródło
1
To był mój problem. bcrypt został zbudowany na MacOS X, ale działa w kontenerze Linux.
Nate Reed
8

Mój problem dotyczył mojego pliku docker-compose.yml, miałem już node_modules w moim .dockerignore, ale musiałem również dodać katalog node_modules jako wolumin:

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

Nacięcie
źródło
6

Miałem również ten sam problem z bcrypt v.1.0.3. Właśnie zaktualizowany do najnowszej wersji (3.0.1) i teraz działa dobrze

Biegać

npm install bcrypt@latest --save
rrt
źródło
To rozwiązało problem, dziękuję, (programuję na MacOS i
wdrażam
2
To nie działa dla mnie (używam wersji 3.0.4) w MacOS
jordins
To nie działa dla mnie i używam wersji 5.0.0 w systemie MacOS
therightstuff
1

Najpierw upewnij się, że nie przesyłasz modułów węzłów i uruchamiasz instalację npm na swoim komputerze z systemem Linux, ponieważ instalacja bcrypt może się różnić w zależności od używanej platformy. Poniżej możesz zapoznać się z innymi instrukcjami instalacji dla innych platform.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Jeśli masz dalsze problemy, może to być związane z node-pre-gyp. Zależność bcrypt.

W przypadku AWS Elastic Beanstalk Podczas wdrażania w Elastic Beanstalk działającym w środowisku Node 8.x, node-gyp nie ma wystarczających uprawnień do zapisu w katalogu tmp. bcrypt nie zostanie zainstalowany, a wdrożenie aplikacji nie powiedzie się.

Rozwiązaniem jest dodanie pliku .npmrc do katalogu głównego projektu, co wymusi działanie node-gyp jako root i umożliwi zakończenie instalacji. Zawartość pliku .npmrc:

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

Inną alternatywą (być może właściwszą metodą) jest utworzenie pliku .ebextensions z kodem:

.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

Zapewni to wystarczający dostęp do uruchomienia node-gyp

sai kasam
źródło
1

Jest prosty sposób, który pozwolił mi rozwiązać ten problem:

1. Odinstaluj bcrypt

npm uninstall bcrypt

2. - Zainstaluj ponownie bcrypt

 npm i bcrypt

Błąd występuje, ponieważ podczas instalowania bcypt, npm instaluje zalecaną wersję dla twojego komputera i systemu operacyjnego, ale gdy jesteś na innym komputerze, to nie działa

crazyProgrammer
źródło
0

Dla tych, którzy wdrażają aplikację w AWS elastycznej łodydze beanstalk i zamierzają zainstalować bcrypt na serwerze, umieść w haku po wdrożeniu w .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
źródło
0

Wiem, że może to być trochę kłopotliwe, ale jest to rozwiązanie. To, co zrobiłem, gdy musiałem wdrożyć Bcrypt, to uruchomienie instancji Cloud 9. Dla tych z Was, którzy nie wiedzą, Cloud9 to podstawowe środowisko AWS IDE działające na instancji EC2. Z Cloud9 możesz przesłać swój kod na IDE jako funkcję lambda. Napisałem więc funkcję na Cloud9 i kiedy ją wgrałem, kod zadziałał.

Pranjal Chaitanya
źródło