bcrypt header elf tidak valid saat menjalankan aplikasi node

87

Saya sedang mengerjakan proyek nodejs untuk sekolah. Saya tidak dapat menginstal bcrypt dengan npm jadi saya menginstal bcrypt-nodejs dan proyek tersebut bekerja dengan baik kemarin. Tapi hari ini, ketika saya melakukan "aplikasi node" saya mengalami kesalahan ini:

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

file package.json saya terlihat seperti ini:

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

Saya menggunakan Linux ubuntu 10.04 LTS Saya telah mencoba menemukan solusi di google tanpa hasil ... Adakah yang bisa membantu saya?

pengguna2244469
sumber
Apakah Anda menemukan solusinya?
MrYoshiji
ya, saya menginstal ubuntu 12.04 dan saya dapat menginstal dan menggunakan bcrypt. terima kasih atas minat Anda pada masalah saya.
pengguna2244469

Jawaban:

164

Saya telah menemukan bahwa bcrypt yang dikompilasi di OSX tidak akan berfungsi di Linux . Dengan kata lain, jika Anda memeriksa bcrypt yang dikompilasi di workstation OSX lokal Anda, dan mencoba menjalankan aplikasi node di server linux Anda, Anda akan melihat kesalahan di atas.

Solusi: npm install bcryptdi Linux, periksa itu, diselesaikan.

Mungkin cara terbaik untuk menangani ini adalah mengecualikan node_modules Anda di .gitignore ... dan npm install dari jarak jauh.

Cmag
sumber
3
Itu karena mereka adalah sistem operasi yang berbeda, dan sangat mungkin, arsitektur prosesor yang mendasari berbeda. Ketika saya masih kuliah, kami memiliki dua cluster UNIX: satu berjalan di VAX yang lain di Alpha. Proyek CS HARUS dikompilasi pada VAX karena itulah yang digunakan profesor ...
tkone
@tkone Tentu, tetapi modul npm mengkompilasi silang: menginstal sesuatu dengan komponen biner memberi Anda biner Mach (OS X), ELF (Linux) dan PXE (Windows).
mikemaccana
1
Satu-satunya masalah adalah: bcrypt, tidak seperti modul node lainnya, hanya menginstal biner OS tunggal. Jadi, melakukan bcrypt yang diinstal Linux akan merusak sistem pengembang Mac Anda , karena node_modules / bcrypt / build / Release / bcrypt_lib.node sekarang menjadi biner Linux. Jalankan file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeuntuk menguji.
mikemaccana
@mikemaccana tentu saja tidak. kami menggunakan vmware & ubuntu untuk dev, tetapi dibagikan dengan Mac kami. socket.io, leveldb, phantomsj, dll semuanya dikompilasi untuk arsitektur target yang Anda instal. Jika saya menginstal level pada mac saya dan mencoba menggunakannya dari VM, itu benar-benar gagal karena dikompilasi untuk darwin dan bukan linux.
tkone
2
@mikemaccana simpul-merendahkannya hanya bekerja karena (dari readme.md yang): Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Ini bukan kompilasi silang, melainkan memberi Anda binari yang telah dikompilasi sebelumnya. Node-gyp TIDAK melakukan kompilasi silang secara default.
tkone
15

Jika Anda menjalankan di dalam kontainer buruh pelabuhan seperti saya, yang Anda butuhkan hanyalah .dockerignore dengan 'node_modules' ditentukan di dalamnya.

Beberapa pustaka perlu dikompilasi pada mesin host dan oleh karena itu modul Anda mungkin sudah usang.

TacoEater
sumber
1
Ini adalah masalahku. bcrypt dibangun di MacOS X tetapi menjalankannya di container linux.
Nate Reed
8

Masalah saya adalah dengan file docker-compose.yml saya, saya sudah memiliki node_modules di .dockerignore saya tetapi saya juga perlu menambahkan direktori node_modules sebagai volume:

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

Nick
sumber
6

Saya juga menghadapi masalah yang sama dengan bcrypt v.1.0.3. Baru saja diperbarui ke versi terbaru (3.0.1) dan berfungsi dengan baik sekarang

Lari

npm install bcrypt@latest --save
rrt
sumber
Ini memecahkan masalah, terima kasih, (Saya memprogram di MacOS dan menerapkannya di server Ubuntu!)
Rakshitha Muranga Rodrigo
2
Ini tidak berfungsi untuk saya (saya menggunakan v3.0.4) di MacOS
jordins
Ini tidak bekerja untuk saya dan saya menggunakan v5.0.0 di MacOS
therightstuff
1

Pertama-tama, pastikan Anda tidak mengunggah modul node dan menjalankan npm install di mesin linux Anda sendiri karena instalasi bcrypt dapat bervariasi tergantung pada platform yang Anda gunakan. Anda dapat melihat petunjuk penginstalan lain untuk platform lain di bawah.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Jika Anda mengalami masalah lebih lanjut, ini mungkin terkait dengan node-pre-gyp. Ketergantungan bcrypt.

Untuk AWS Elastic Beanstalk Saat menerapkan ke Elastic Beanstalk yang menjalankan Node 8.x, node-gyp tidak memiliki izin yang memadai untuk menulis ke direktori tmp. bcrypt tidak dapat diinstal dan penerapan aplikasi akan gagal.

Solusinya adalah dengan menambahkan file .npmrc ke root proyek Anda yang akan memaksa node-gyp untuk dijalankan sebagai root dan memungkinkan penginstalan selesai. Isi file untuk .npmrc:

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

Alternatif lain (Mungkin cara yang lebih tepat) adalah membuat file .ebextensions dengan kode:

.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

Ini akan memberi Anda akses yang memadai untuk menjalankan node-gyp

sai kasam
sumber
1

Ada cara sederhana yang memungkinkan saya menyelesaikan masalah ini:

1. Copot pemasangan bcrypt

npm uninstall bcrypt

2.- Instal bcrypt lagi

 npm i bcrypt

Kesalahan terjadi karena ketika Anda menginstal bcypt, npm menginstal versi yang disarankan untuk mesin dan sistem operasi Anda, tetapi ketika Anda berada di komputer lain, ini tidak berfungsi

crazyProgrammer
sumber
0

Bagi mereka yang menerapkan aplikasi ke AWS elastic beanstalk, dan akan menginstal bcrypt di server, termasuk dalam hook penerapan posting di .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
sumber
0

Saya tahu bahwa ini mungkin sedikit merepotkan tetapi ini adalah solusinya. Apa yang saya lakukan ketika saya perlu mengimplementasikan Bcrypt, adalah saya memulai instance Cloud 9. Bagi Anda yang tidak tahu, Cloud9 adalah AWS IDE dasar yang berjalan pada instans EC2. Dari Cloud9 Anda dapat mengunggah kode Anda pada ide sebagai fungsi lambda. Jadi saya menulis fungsinya di Cloud9 dan ketika saya mengunggahnya, kodenya berfungsi.

Pranjal Chaitanya
sumber