node uygulamasını çalıştırırken bcrypt geçersiz elf başlığı


87

Okul için bir nodejs projesi üzerinde çalışıyorum. Bcrypt'i npm ile yükleyemedim, bu yüzden bcrypt-nodejs'yi kurdum ve proje dün iyi çalıştı. Ancak bugün, bir "düğüm uygulaması" yaptığımda şu hatayı alıyorum:

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

package.json dosyam şöyle görünüyor:

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

Linux'tayım ubuntu 10.04 LTS Google'da başarılı olmadan bir çözüm bulmaya çalıştım ... Biri bana yardım edebilir mi?


bir çözüm buldun mu?
MrYoshiji

evet, ubuntu 12.04'ü kurdum ve bcrypt'i kurup kullanabildim. sorunumla ilgilendiğiniz için teşekkürler.
user2244469

Yanıtlar:


164

OSX'te derlenen bcrypt'in Linux'ta tam olarak çalışmayacağını buldum . Başka bir deyişle, yerel OSX iş istasyonunuzda derlenen bcrypt'i kontrol ederseniz ve düğüm uygulamasını linux sunucularınızda çalıştırmayı denerseniz, yukarıdaki hatayı göreceksiniz.

Çözüm: npm install bcryptLinux'ta, bunu kontrol edin, çözüldü.

Muhtemelen bunun üstesinden gelmenin en iyi yolu, .gitignore ... içindeki node_modüllerinizi hariç tutmak ve npm'yi uzaktan kurmaktır.


3
Bunun nedeni, farklı işletim sistemleri ve büyük olasılıkla farklı temel işlemci mimarileri olmasıdır. Üniversitedeyken iki UNIX kümemiz vardı: biri VAX üzerinde, diğeri Alpha üzerinde çalışıyor. CS projeleri
VAX'te

@tkone Elbette, ancak npm modülleri çapraz derleme: bir ikili bileşen ile bir şey kurmak size bir Mach (OS X), ELF (Linux) ve PXE (Windows) ikili dosyası verir.
mikemaccana

1
Tek sorun şudur: bcrypt, diğer düğüm modüllerinden farklı olarak, yalnızca tek bir işletim sistemi ikili dosyası yükler. Yani Mac geliştirici sistemlerini kıracak Linux yüklenmiş Bcrypt işlemekten node_modules / bcrypt / build / Yayın / bcrypt_lib.node artık Linux ikili olduğundan,. file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeTest etmek için çalıştırın .
mikemaccana

@mikemaccana kesinlikle yok. dev için vmware ve ubuntu kullanıyoruz, ancak mac'larımızla paylaşıyoruz. socket.io, leveldb, phantomsj, vb. tümü kurduğunuz hedef mimari için derlenir. Mac'ime level kurarsam ve onu sanal makineden kullanmaya çalışırsam, Linux için değil, darwin için derlendiği için tamamen başarısız oluyor.
tkone

2
@mikemaccana düğüm-küstahlık çünkü sadece (readme.md itibaren) çalışır: Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Çapraz derleme değil, size önceden derlenmiş ikili dosyalar verir. Düğüm-gyp varsayılan olarak çapraz derleme YAPMAZ.
tkone

15

Benim gibi bir docker kapsayıcısının içinde çalışıyorsanız, ihtiyacınız olan tek şey, içinde 'node_modules' belirtilen bir .dockerignore'dur.

Bazı kitaplıkların ana makinede derlenmesi gerekir ve bu nedenle modülleriniz eski olabilir.


1
Bu benim sorunumdu. bcrypt, MacOS X üzerinde oluşturulmuştur, ancak onu bir linux kapsayıcısında çalıştırmaktadır.
Nate Reed

8

Sorunum docker-compose.yml dosyamla ilgiliydi, .dockerignore dosyamda zaten node_modules vardı, ancak node_modules dizinini de bir birim olarak eklemem gerekiyordu:

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


6

Ben de bcrypt v.1.0.3 ile aynı sorunla karşılaşıyordum. En son sürüme (3.0.1) yeni güncellendi ve şimdi iyi çalışıyor

Çalıştırmak

npm install bcrypt@latest --save

Bu sorunu çözdü, teşekkür ederim (
MacOS'ta

2
MacOS'ta bu benim için çalışmıyor (v3.0.4 kullanıyorum)
jordins

Bu benim için çalışmıyor ve MacOS'ta v5.0.0 kullanıyorum
therightstuff

1

Öncelikle düğüm modüllerini yüklemediğinizden ve linux makinenizde npm kurulumunu çalıştırdığınızdan emin olun çünkü bcrypt kurulumu kullandığınız platforma bağlı olarak değişebilir. Aşağıdaki diğer platformlar için diğer kurulum talimatlarına bakabilirsiniz.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Daha fazla sorun yaşıyorsanız, düğüm ön-gyp ile ilgili olabilir. Bir bcrypt bağımlılığı.

AWS Elastic Beanstalk için Node 8.x çalıştıran Elastic Beanstalk'a dağıtırken, node-gyp'in tmp dizinine yazmak için yeterli izni yoktur. bcrypt yüklenmeyecek ve uygulama dağıtımı başarısız olacaktır.

Geçici bir çözüm, projenizin köküne node-gyp'yi kök olarak çalışmaya zorlayacak ve kurulumun tamamlanmasına izin verecek bir .npmrc dosyası eklemektir. .Npmrc için dosya içeriği:

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

Diğer bir alternatif (Belki daha doğru olanı), .ebextensions dosyasını kodla yapmaktır:

.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

Bu size node-gyp'yi çalıştırmak için yeterli erişim sağlayacaktır.


1

Bu sorunu çözmeme izin veren basit bir yol var:

1. bcrypt'i kaldırın

npm uninstall bcrypt

2. - bcrypt'i tekrar kurun

 npm i bcrypt

Hata, bcypt'i yüklediğinizde, npm, makineniz ve işletim sisteminiz için önerilen sürümü yüklediği için oluşur, ancak başka bir makinedeyseniz bu çalışmaz


0

AWS elastik beanstalk'a bir uygulama dağıtan ve sunucuya bcrypt kuracak olanlar için, bir dağıtım sonrası kancaya dahil edin .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

Bunun biraz güçlük çekebileceğini biliyorum ama bir çözüm. Bcrypt'i uygulamaya ihtiyacım olduğunda yaptığım şey, bir Cloud 9 bulut sunucusu başlatmamdı. Bilmeyenleriniz için Cloud9, EC2 bulut sunucusu üzerinde çalışan temel bir AWS IDE'dir. Cloud9'dan kodunuzu ide'ye bir lambda işlevi olarak yükleyebilirsiniz. Bu yüzden işlevi Cloud9'a yazdım ve yüklediğimde kod çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.