bcrypt недопустимый заголовок elf при запуске приложения узла

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 ... Кто-нибудь может мне помочь?

user2244469
источник
Вы нашли решение?
MrYoshiji
да, я установил ubuntu 12.04 и смог установить и использовать bcrypt. спасибо за интерес к моему вопросу.
user2244469

Ответы:

163

Я обнаружил, что bcrypt, скомпилированный в OSX, не будет работать в Linux . Другими словами, если вы зарегистрируете bcrypt, скомпилированный на вашей локальной рабочей станции OSX, и попытаетесь запустить приложение узла на своих серверах Linux, вы увидите ошибку выше.

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

Вероятно, лучший способ справиться с этим - исключить ваши node_modules в .gitignore ... и установить npm удаленно.

Cmag
источник
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 для разработки, но совместно с нашими 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'.

Некоторые библиотеки необходимо скомпилировать на хост-машине, поэтому ваши модули могут быть устаревшими.

TacoEater
источник
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
rrt
источник
Это решило проблему, спасибо (я программирую на 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, и когда я ее загрузил, код заработал.

Пранджал Чайтанья
источник