bcrypt ส่วนหัวเอลฟ์ไม่ถูกต้องเมื่อเรียกใช้แอปโหนด


87

ฉันกำลังทำโปรเจ็กต์ nodejs สำหรับโรงเรียน ฉันไม่สามารถติดตั้ง bcrypt ด้วย npm ได้ดังนั้นฉันจึงติดตั้ง bcrypt-nodejs และโครงการทำงานได้ดีเมื่อวานนี้ แต่วันนี้เมื่อฉันสร้าง "แอปโหนด" ฉันพบข้อผิดพลาดนี้:

/.../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 ของฉันมีลักษณะดังนี้:

{
  "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 ubuntu 10.04 LTS ฉันพยายามหาวิธีแก้ปัญหาใน google แล้วไม่ประสบความสำเร็จ ... ใครช่วยฉันได้บ้าง


คุณพบวิธีแก้ปัญหาหรือไม่?
MrYoshiji

ใช่ฉันติดตั้ง ubuntu 12.04 และฉันสามารถติดตั้งและใช้ bcrypt ได้ ขอบคุณที่สนใจปัญหาของฉัน
user2244469

คำตอบ:


164

ฉันพบว่าbcrypt รวบรวมใน OSX จะไม่ได้ค่อนข้างทำงานบนลินุกซ์ กล่าวอีกนัยหนึ่งถ้าคุณตรวจสอบ bcrypt ที่คอมไพล์บนเวิร์กสเตชัน OSX ในพื้นที่ของคุณและพยายามเรียกใช้แอปโหนดบนเซิร์ฟเวอร์ linux ของคุณคุณจะเห็นข้อผิดพลาดด้านบน

วิธีแก้ไข: npm install bcryptบน Linux ตรวจสอบว่าแก้ไขแล้ว

อาจเป็นวิธีที่ดีที่สุดในการจัดการกับปัญหานี้คือยกเว้น node_modules ของคุณใน. gitignore ... และติดตั้ง npm จากระยะไกล


3
นั่นเป็นเพราะพวกเขาเป็นระบบปฏิบัติการที่แตกต่างกันและอาจมีสถาปัตยกรรมโปรเซสเซอร์ที่แตกต่างกัน ตอนที่ฉันอยู่ในวิทยาลัยเรามีคลัสเตอร์ UNIX สองคลัสเตอร์: อันหนึ่งทำงานบน VAX อีกคลัสเตอร์ใน Alpha โครงการ CS HAD จะรวบรวมบน VAX เนื่องจากเป็นสิ่งที่ศาสตราจารย์ใช้ ...
tkone

@tkone แน่นอน แต่โมดูล npm cross-compile: การติดตั้งบางอย่างด้วยส่วนประกอบไบนารีจะช่วยให้คุณมีไบนารี Mach (OS X), ELF (Linux) และ PXE (Windows)
mikemaccana

1
ปัญหาเดียวคือ bcrypt ซึ่งแตกต่างจากโมดูลโหนดอื่น ๆ ติดตั้งไบนารีระบบปฏิบัติการเดียวเท่านั้น ดังนั้นการคอมมิต bcrypt ที่ติดตั้งบน Linux จะทำให้ระบบนักพัฒนา Mac ของคุณพังเนื่องจาก node_modules / bcrypt / build / Release / bcrypt_lib.node กลายเป็นไบนารีของ Linux เรียกใช้file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeเพื่อทดสอบ
mikemaccana

@mikemaccana พวกเขาไม่ทำอย่างแน่นอน เราใช้ vmware & ubuntu สำหรับ dev แต่แชร์กับ mac ของเรา socket.io, leveldb, phantomsj และอื่น ๆ ทั้งหมดรวบรวมสำหรับสถาปัตยกรรมเป้าหมายที่คุณกำลังติดตั้ง หากฉันติดตั้งระดับบน mac ของฉันและพยายามใช้จาก VM มันจะล้มเหลวโดยสิ้นเชิงเนื่องจากคอมไพล์สำหรับดาร์วินไม่ใช่ลินุกซ์
tkone

2
@mikemaccana โหนดเขื่องทำงานเพียงเพราะ (จาก readme.md) Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:ที่: ไม่ใช่การคอมไพล์ข้าม แต่ให้ไบนารีที่คอมไพล์ไว้ล่วงหน้า Node-gyp ไม่คอมไพล์ข้ามตามค่าเริ่มต้น
tkone

15

หากคุณกำลังใช้งานภายในคอนเทนเนอร์นักเทียบท่าเหมือนฉันสิ่งที่คุณต้องมีคือ. dockerignore ที่ระบุ 'node_modules'

ไลบรารีบางไลบรารีจำเป็นต้องรวบรวมบนเครื่องโฮสต์ดังนั้นโมดูลของคุณอาจเก่า


1
นี่คือปัญหาของฉัน bcrypt สร้างขึ้นบน MacOS X แต่ใช้งานในคอนเทนเนอร์ linux
Nate Reed

8

ปัญหาของฉันเกิดจากไฟล์ docker-compose.yml ของฉันฉันมี node_modules ใน. dockerignore ของฉันอยู่แล้ว แต่ฉันก็ต้องเพิ่มไดเร็กทอรี node_modules เป็นโวลุ่มด้วย:

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


6

ฉันยังประสบปัญหาเดียวกันกับ bcrypt v.1.0.3 เพิ่งอัปเดตเป็นเวอร์ชันล่าสุด (3.0.1) และทำงานได้ดีในขณะนี้

วิ่ง

npm install bcrypt@latest --save

สิ่งนี้แก้ไขปัญหาได้ขอบคุณ (ฉันกำลังเขียนโปรแกรมบน MacOS และปรับใช้บนเซิร์ฟเวอร์ Ubuntu!)
Rakshitha Muranga Rodrigo

2
สิ่งนี้ใช้ไม่ได้สำหรับฉัน (ฉันใช้ v3.0.4) ใน MacOS
jordins

สิ่งนี้ใช้ไม่ได้สำหรับฉันและฉันใช้ v5.0.0 ใน MacOS
therightstuff

1

ขั้นแรกตรวจสอบให้แน่ใจว่าคุณไม่ได้อัปโหลดโมดูลโหนดและกำลังเรียกใช้การติดตั้ง npm บนเครื่อง linux ของคุณเนื่องจากการติดตั้ง bcrypt อาจแตกต่างกันไปขึ้นอยู่กับแพลตฟอร์มที่คุณใช้ คุณสามารถดูคำแนะนำการติดตั้งอื่น ๆ สำหรับแพลตฟอร์มอื่น ๆ ด้านล่าง
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

หากคุณกำลังมีปัญหาเพิ่มเติมอาจเกี่ยวข้องกับ node-pre-gyp การพึ่งพา bcrypt

สำหรับ AWS Elastic Beanstalk เมื่อปรับใช้กับ Elastic Beanstalk ที่รันโหนด 8.x node-gyp ไม่มีสิทธิ์เพียงพอที่จะเขียนไปยังไดเร็กทอรี tmp bcrypt จะไม่ติดตั้งและการปรับใช้แอปพลิเคชันจะล้มเหลว

วิธีแก้ปัญหาคือการเพิ่มไฟล์. npmrc ไปยังรูทของโปรเจ็กต์ของคุณซึ่งจะบังคับให้ node-gyp รันเป็นรูทและอนุญาตให้การติดตั้งเสร็จสมบูรณ์ เนื้อหาไฟล์สำหรับ. npmrc:

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

อีกทางเลือกหนึ่ง (อาจเป็นวิธีที่ถูกต้องกว่า) คือการสร้างไฟล์. ebextensions ด้วยรหัส:

.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

สิ่งนี้จะช่วยให้คุณสามารถเข้าถึง node-gyp ได้อย่างเพียงพอ


1

มีวิธีง่ายๆที่ช่วยให้ฉันแก้ปัญหานี้ได้:

1. ถอนการติดตั้ง bcrypt

npm uninstall bcrypt

2.- ติดตั้ง bcrypt อีกครั้ง

 npm i bcrypt

ข้อผิดพลาดเกิดขึ้นเนื่องจากเมื่อคุณติดตั้ง bcypt npm จะติดตั้งเวอร์ชันที่แนะนำสำหรับเครื่องและระบบปฏิบัติการของคุณ แต่เมื่อคุณอยู่บนเครื่องอื่นสิ่งนี้จะไม่ทำงาน


0

สำหรับผู้ที่ปรับใช้แอปกับ AWS elastic beanstalk และจะติดตั้ง bcrypt บนเซิร์ฟเวอร์ให้รวมไว้ใน post deploy hook ใน.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

ฉันรู้ว่านี่อาจจะยุ่งยาก แต่ก็เป็นวิธีแก้ปัญหา สิ่งที่ฉันทำเมื่อต้องการใช้ Bcrypt คือฉันเริ่มอินสแตนซ์ Cloud 9 สำหรับผู้ที่ไม่รู้จัก Cloud9 เป็น AWS IDE พื้นฐานที่ทำงานบนอินสแตนซ์ EC2 จาก Cloud9 คุณสามารถอัปโหลดโค้ดของคุณบน ide เป็นฟังก์ชันแลมด้า ดังนั้นฉันจึงเขียนฟังก์ชันบน Cloud9 และเมื่อฉันอัปโหลดโค้ดก็ใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.