노드 앱을 실행할 때 bcrypt 유효하지 않은 elf 헤더


87

저는 학교를위한 nodejs 프로젝트를 진행하고 있습니다. npm으로 bcrypt를 설치할 수 없어서 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 우분투 10.04 LTS를 사용하고 있습니다. Google에서 성공하지 못한 솔루션을 찾으려고 노력했습니다. 누군가 나를 도울 수 있습니까?


해결책을 찾았습니까?
MrYoshiji

예, 우분투 12.04를 설치했고 bcrypt를 설치하고 사용할 수있었습니다. 제 문제에 관심을 가져 주셔서 감사합니다.
user2244469 2013 년

답변:


163

나는 OSX에서 컴파일 된 bcrypt가 Linux에서 제대로 작동하지 않는다는 것을 발견했습니다 . 즉, 로컬 OSX 워크 스테이션에서 컴파일 된 bcrypt를 체크인하고 Linux 서버에서 노드 앱을 실행하려고하면 위의 오류가 표시됩니다.

해결책 : npm install bcryptLinux에서 확인하고 해결했습니다.

아마도 이것을 처리하는 가장 좋은 방법은 .gitignore ...에서 node_modules를 제외하고 npm은 원격으로 설치하는 것입니다.


3
이는 운영 체제가 다르고 기본 프로세서 아키텍처가 다를 수 있기 때문입니다. 제가 대학에있을 때 두 개의 UNIX 클러스터가있었습니다. 하나는 VAX에서 실행되고 다른 하나는 Alpha에서 실행되었습니다. CS 프로젝트는 ... 교수가 무엇을 사용하는의 이후 VAX에서 컴파일해야했다
tkone

@tkone 물론입니다.하지만 npm 모듈은 크로스 컴파일합니다. 바이너리 구성 요소로 무언가를 설치하면 Mach (OS X), ELF (Linux) 및 PXE (Windows) 바이너리가 제공됩니다.
mikemaccana 2014 년

1
유일한 문제는 다른 노드 모듈과 달리 bcrypt는 단일 OS 바이너리 만 설치한다는 것입니다. 따라서 Linux가 설치된 bcrypt를 커밋하면 node_modules / bcrypt / build / Release / bcrypt_lib.node가 이제 Linux 바이너리이므로 Mac 개발자 시스템이 손상됩니다 . file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.node테스트를 위해 실행하십시오 .
mikemaccana 2014 년

@mikemaccana 그들은 확실히하지 않습니다. 우리는 dev에 vmware 및 ubuntu를 사용하지만 Mac과 공유합니다. socket.io, leveldb, phantomsj 등은 모두 설치하려는 대상 아키텍처에 대해 컴파일됩니다. Mac에 레벨을 설치하고 VM에서 사용하려고하면 Linux가 아닌 darwin 용으로 컴파일되었으므로 완전히 실패합니다.
tkone 2014 년

2
@mikemaccana node-sass는 (readme.md에서) : Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:. 크로스 컴파일이 아니라 미리 컴파일 된 바이너리를 제공합니다. Node-gyp은 기본적으로 크로스 컴파일하지 않습니다.
tkone 2014 년

13

내가있는 그대로 도커 컨테이너 내부에서 실행중인 경우 'node_modules'가 지정된 .dockerignore 만 있으면됩니다.

일부 라이브러리는 호스트 시스템에서 컴파일해야하므로 모듈이 오래 될 수 있습니다.


1
이것은 내 문제였습니다. bcrypt는 MacOS X에서 빌드되었지만 Linux 컨테이너에서 실행되었습니다.
Nate Reed

7

내 문제는 내 docker-compose.yml 파일에 있었고 이미 .dockerignore에 node_modules가 있었지만 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

이 (! 내가 맥 OS에 프로그래밍 및 우분투 서버에 배포를하고 있습니다), 감사, 문제를 해결
Rakshitha Muranga 로드리고

1
이것은 MacOS에서 작동하지 않습니다 (v3.0.4를 사용하고 있습니다)
jordins

1

bcrypt 설치는 사용하는 플랫폼에 따라 다를 수 있으므로 먼저 노드 모듈을 업로드하지 않고 Linux 시스템 자체에서 npm install을 실행하고 있는지 확인하십시오. 아래에서 다른 플랫폼에 대한 다른 설치 지침을 볼 수 있습니다.
https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions

추가 문제가있는 경우 node-pre-gyp과 관련이있을 수 있습니다. bcrypt의 종속성.

AWS Elastic Beanstalk의 경우 Node 8.x를 실행하는 Elastic Beanstalk에 배포 할 때 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이 시스템 및 운영 체제에 권장되는 버전을 설치하지만 다른 시스템에있는 경우 작동하지 않기 때문에 발생합니다.


이것은 실제로 나를 위해 일했습니다. 감사합니다
Francis

0

AWS Elastic beanstalk에 앱을 배포하고 서버에 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는 EC2 인스턴스에서 실행되는 기본 AWS IDE입니다. Cloud9에서 람다 함수로 ide에 코드를 업로드 할 수 있습니다. 그래서 Cloud9에 함수를 작성했고 업로드했을 때 코드가 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.