bcrypt недійсний заголовок elf під час запуску програми node


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

Відповіді:


163

Я виявив, що bcrypt, скомпільований на OSX, не буде повністю працювати в Linux . Іншими словами, якщо ви перевірите bcrypt, скомпільований на вашій локальній робочій станції OSX, і спробуєте запустити програму node на своїх серверах Linux, ви побачите помилку вище.

Рішення: npm install bcryptв Linux перевірте, вирішено.

Напевно, найкращий спосіб вирішити це питання - виключити node_modules у .gitignore ... та встановити віддалено npm.


3
Це тому, що вони різні операційні системи, і цілком можливо, різні базові архітектури процесорів. Коли я навчався в коледжі, у нас було два кластери UNIX: один працював на VAX, інший на Alpha. Проекти CS повинні були бути скомпільовані на VAX, оскільки це те, що використовував професор ...
tkone

@tkone Звичайно, але модулі npm перекомпілюються: встановлення чогось із двійковим компонентом дає двійковий файл Mach (OS X), ELF (Linux) та PXE (Windows).
mikemaccana

1
Єдина проблема: bcrypt, на відміну від інших вузлових модулів, встановлює лише один двійковий файл ОС. Отже, встановлення встановленого Linux bcrypt зламає ваші системи розробників 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 і спробую використовувати його з віртуальної машини, він повністю зазнає невдачі, оскільки він скомпільований для darwin, а не для linux.
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

13

Якщо ви працюєте всередині контейнера докера, як і я, вам знадобиться лише .dockerignore із зазначеними в ньому 'node_modules'.

Деякі бібліотеки потрібно компілювати на хост-машині, і тому ваші модулі можуть бути застарілими.


1
Це була моя проблема. bcrypt був побудований на MacOS X, але запускав його у контейнері Linux.
Нейт Рід

7

Моя проблема була з моїм файлом 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!)
Ракшіта Муранга Родріго

1
Це не працює для мене (я використовую v3.0.4) в MacOS
jordins

1

Спочатку переконайтесь, що ви не завантажуєте вузлові модулі та запускаєте npm install на самій машині Linux, оскільки встановлення bcrypt може змінюватися залежно від платформи, яку ви використовуєте. Інші інструкції з установки інших платформ ви можете переглянути нижче.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

Якщо у вас виникли подальші проблеми, це може бути пов'язано з node-pre-gyp. Залежність bcrypt.

Для AWS Elastic Beanstalk При розгортанні на Elastic Beanstalk, що працює на Node 8.x, node-gyp не має достатніх дозволів для запису в каталог tmp. bcrypt не встановлюється, і розгортання програми не вдасться.

Обхідним шляхом є додавання файлу .npmrc до кореня вашого проекту, що змусить node-gyp запуститися як root і дозволить завершити інсталяцію. Вміст файлу для .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

Для тих, хто розгортає програму на еластичному beanstalk AWS і збирається встановити bcrypt на сервері, включіть у гачок після розгортання .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 - це основна IDE AWS, яка працює на екземплярі EC2. З Cloud9 ви можете завантажити свій код на ide як лямбда-функцію. Тому я написав функцію на Cloud9, і коли я її завантажив, код спрацював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.