bcrypt tiêu đề elf không hợp lệ khi chạy ứng dụng nút


87

Tôi đang thực hiện một dự án nodejs cho trường học. Tôi không thể cài đặt bcrypt với npm vì vậy tôi đã cài đặt bcrypt-nodejs và hôm qua dự án đã hoạt động tốt. Nhưng hôm nay, khi tôi thực hiện một "ứng dụng nút", tôi gặp lỗi này:

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

tệp package.json của tôi trông giống như sau:

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

Tôi đang sử dụng Linux ubuntu 10.04 LTS Tôi đã cố gắng tìm giải pháp trên google mà không thành công ... Ai đó có thể giúp tôi không?


Bạn đã tìm thấy một giải pháp?
MrYoshiji

vâng, tôi đã cài đặt ubuntu 12.04 và tôi có thể cài đặt và sử dụng bcrypt. cảm ơn bạn đã quan tâm đến vấn đề của tôi.
user2244469

Câu trả lời:


163

Tôi thấy rằng bcrypt được biên dịch trên OSX sẽ không hoạt động trên Linux . Nói cách khác, nếu bạn kiểm tra bcrypt được biên dịch trên máy trạm OSX cục bộ và thử chạy ứng dụng nút trên máy chủ linux của mình, bạn sẽ thấy lỗi ở trên.

Giải pháp: npm install bcrypttrên Linux, kiểm tra điều đó, đã giải quyết.

Có lẽ cách tốt nhất để giải quyết vấn đề này là loại trừ node_modules của bạn trong .gitignore ... và cài đặt npm từ xa.


3
Đó là bởi vì chúng là các hệ điều hành khác nhau và rất có thể, các kiến ​​trúc bộ xử lý cơ bản khác nhau. Khi tôi còn học đại học, chúng tôi có hai cụm UNIX: một chạy trên VAX, còn lại chạy trên Alpha. CS dự án HAD sẽ được biên dịch trên VAX vì đó là những gì giáo sư đã sử dụng ...
tkone

@tkone Chắc chắn rồi, nhưng mô-đun npm biên dịch chéo: cài đặt somthing với thành phần nhị phân cung cấp cho bạn bản nhị phân Mach (OS X), ELF (Linux) và PXE (Windows).
mikemaccana

1
Vấn đề duy nhất là: bcrypt, không giống như các mô-đun nút khác, chỉ cài đặt một hệ điều hành nhị phân duy nhất. Vì vậy, việc sử dụng bcrypt do Linux cài đặt sẽ phá vỡ hệ thống nhà phát triển Mac của bạn , vì node_modules / bcrypt / build / Release / bcrypt_lib.node hiện là một tệp nhị phân Linux. Chạy file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.nodeđể kiểm tra.
mikemaccana

@mikemaccana họ chắc chắn không. chúng tôi sử dụng vmware & ubuntu cho nhà phát triển, nhưng được chia sẻ với máy tính của chúng tôi. socket.io, leveldb, phantomsj, v.v. tất cả đều biên dịch cho kiến ​​trúc đích mà bạn đang cài đặt. Nếu tôi cài đặt cấp độ trên máy mac của mình và cố gắng sử dụng nó từ máy ảo, nó hoàn toàn không thành công vì nó được biên dịch cho darwin chứ không phải linux.
tkone

2
@mikemaccana node-sass chỉ hoạt động vì (từ readme.md) : Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. Nó không phải là biên dịch chéo, mà là cung cấp cho bạn các tệp nhị phân được biên dịch trước. Node-gyp KHÔNG biên dịch chéo theo mặc định.
tkone

13

Nếu bạn đang chạy bên trong vùng chứa docker như tôi, tất cả những gì bạn cần là .dockerignore với 'node_modules' được chỉ định trong đó.

Một số thư viện cần được biên dịch trên máy chủ và do đó các mô-đun của bạn có thể cũ.


1
Đây là vấn đề của tôi. bcrypt được xây dựng trên MacOS X nhưng chạy nó trong một vùng chứa linux.
Nate Reed

7

Vấn đề của tôi là với tệp docker-compost.yml, tôi đã có node_modules trong .dockerignore của mình nhưng tôi cũng cần thêm thư mục node_modules dưới dạng một ổ đĩa:

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


6

Tôi cũng gặp phải vấn đề tương tự với bcrypt v.1.0.3. Vừa được cập nhật lên phiên bản mới nhất (3.0.1) và hiện nó hoạt động tốt

Chạy

npm install bcrypt@latest --save

Điều này đã giải quyết được vấn đề, cảm ơn bạn, (Tôi đang lập trình trên MacOS và triển khai nó trên máy chủ Ubuntu!)
Rakshitha Muranga Rodrigo 14/1218

1
Điều này không hiệu quả với tôi (tôi đang sử dụng v3.0.4) trong MacOS
jordins

1

Trước tiên, hãy đảm bảo rằng bạn không tải lên các mô-đun nút và đang chạy cài đặt npm trên chính máy linux của bạn vì cài đặt bcrypt có thể khác nhau tùy thuộc vào nền tảng bạn sử dụng. Bạn có thể xem hướng dẫn cài đặt khác cho các nền tảng khác bên dưới.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Nếu bạn đang gặp vấn đề khác, nó có thể liên quan đến node-pre-gyp. Một phụ thuộc của bcrypt.

Đối với AWS Elastic Beanstalk Khi triển khai tới Elastic Beanstalk chạy Node 8.x, node-gyp không có đủ quyền để ghi vào thư mục tmp. bcrypt sẽ không cài đặt và triển khai ứng dụng sẽ không thành công.

Cách giải quyết là thêm tệp .npmrc vào thư mục gốc của dự án của bạn, tệp này sẽ buộc nút-gyp chạy dưới dạng thư mục gốc và cho phép quá trình cài đặt hoàn tất. Nội dung tệp cho .npmrc:

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

Một giải pháp thay thế khác (Có lẽ là cách đúng đắn hơn) là tạo tệp .ebextensions với mã:

.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

Điều này sẽ cung cấp cho bạn đủ quyền truy cập để chạy node-gyp


1

Có một cách đơn giản cho phép tôi giải quyết vấn đề này:

1. Gỡ cài đặt bcrypt

npm uninstall bcrypt

2.- Cài đặt lại bcrypt

 npm i bcrypt

Lỗi xảy ra do khi bạn cài đặt bcypt, npm cài đặt phiên bản được đề xuất cho máy và hệ điều hành của bạn, nhưng khi bạn đang ở trên máy khác, điều này không hoạt động


Điều này thực sự đã làm việc cho tôi. Cảm ơn
Francis

0

Đối với những người đang triển khai một ứng dụng cho AWS đàn hồi beantalk và sẽ cài đặt bcrypt trên máy chủ, hãy đưa vào một móc đăng triển khai trong .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

Tôi biết rằng điều này có thể hơi phức tạp nhưng đó là một giải pháp. Những gì tôi đã làm khi cần triển khai Bcrypt, là tôi bắt đầu một phiên bản Cloud 9. Đối với những người bạn chưa biết, Cloud9 là một IDE AWS cơ bản chạy trên phiên bản EC2. Từ Cloud9, bạn có thể tải lên mã của mình trên Ide dưới dạng hàm lambda. Vì vậy, tôi đã viết hàm trên Cloud9 và khi tôi tải lên, mã đã hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.