【问题标题】:bcrypt invalid elf header when running node app运行节点应用程序时bcrypt无效的elf标头
【发布时间】:2013-03-26 10:23:44
【问题描述】:

我正在为学校开发一个 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 ubuntu 10.04 LTS 我试图在谷歌上找到解决方案但没有成功...... 有人可以帮帮我吗?

【问题讨论】:

  • 您找到解决方案了吗?
  • 是的,我安装了 ubuntu 12.04 并且能够安装和使用 bcrypt。感谢您对我的问题感兴趣。

标签: node.js elf bcrypt


【解决方案1】:

我发现在 OSX 上编译的 bcrypt 在 Linux 上不太适用。换句话说,如果您签入在本地 OSX 工作站上编译的 bcrypt,并尝试在您的 linux 服务器上运行 node 应用程序,您将看到上述错误。

解决方案:Linux 上的npm install bcrypt,签入,解决。

处理这个问题的最好方法可能是排除 .gitignore... 中的 node_modules 并远程安装 npm。

【讨论】:

  • 那是因为它们是不同的操作系统,很可能是不同的底层处理器架构。当我上大学时,我们有两个 UNIX 集群:一个在 VAX 上运行,另一个在 Alpha 上运行。 CS项目必须在VAX上编译,因为这是教授使用的......
  • @tkone 当然可以,但是 npm 模块交叉编译:安装带有二进制组件的东西会给你一个 Mach (OS X)、ELF (Linux) 和 PXE (Windows) 二进制文件。
  • 唯一的问题是: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 他们当然不会。我们使用 vmware 和 ubuntu 进行开发,但与我们的 Mac 共享。 socket.io、leveldb、phantomsj 等都针对您要安装的目标架构进行编译。如果我在我的 mac 上安装 level 并尝试从 VM 使用它,它会完全失败,因为它是为 darwin 而不是 linux 编译的。
  • @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 默认不交叉编译。
【解决方案2】:

在使用 bcrypt v.1.0.3 时,我也遇到了同样的问题。 刚刚更新到最新版本(3.0.1),现在可以正常使用了

运行

npm install bcrypt@latest --save

【讨论】:

  • 这解决了这个问题,谢谢,(我在 MacOS 上编程并在 Ubuntu 服务器上部署它!)
  • 这对我在 MacOS 中不起作用(我使用的是 v3.0.4)
  • 这对我不起作用,我在 MacOS 中使用 v5.0.0
【解决方案3】:

对于那些将应用程序部署到 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

【讨论】:

    【解决方案4】:

    如果您像我一样在 docker 容器中运行,您只需要一个 .dockerignore 并在其中指定“node_modules”。

    一些库需要在主机上编译,因此您的模块可能是陈旧的。

    【讨论】:

    • 这是我的问题。 bcrypt 是在 MacOS X 上构建的,但在 linux 容器中运行。
    • 真的很感谢你,这让我头疼了很久。
    【解决方案5】:

    我的问题与我的 docker-compose.yml 文件有关,我的 .dockerignore 中已经有 node_modules 但我还需要将 node_modules 目录添加为卷:

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

    【讨论】:

    • 不知道为什么,但只有这个解决方案对我有用!谢谢!
    • 我使用 Windows 和 contianer node:bind,只有这个解决方案对我有用。
    【解决方案6】:

    首先确保您没有上传节点模块,而是在您的 linux 机器上运行 npm install,因为 bcrypt 安装可能会因您使用的平台而异。您可以在下面查看其他平台的其他安装说明。
    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

    【讨论】:

      【解决方案7】:

      有一个简单的方法可以让我解决这个问题:

      1.卸载 bcrypt

      npm uninstall bcrypt
      

      2.- 再次安装 bcrypt

       npm i bcrypt
      

      出现错误是因为当你安装 bcypt 时,npm 会为你的机器和操作系统安装推荐的版本,但是当你在另一台机器上时,这不起作用。

      -------- 更新 ------------------------------- ---------

      在我看来,另一个解决方案是授予 bcrypt 安装 root 权限,这是因为 bcryp 使用自己的用户但它没有权限,所以:

      1.您必须授予项目文件夹的 root 权限。走出你的项目文件夹,然后

      sudo su
      

      然后输入你的root密码获取root用户权限

      2。授予您项目文件夹的权限

      chmod -R 777 <project_folder>
      

      3.转到您的项目文件夹并安装 bcrypt

      cd <project_folder>
      

      npm i bcrypt --unsafe-perm=true --allow-root --save
      

      准备好了,如果一切正常,您的 bcrypt 模块将顺利安装。

      【讨论】:

      • 当没有强制标志时,卸载和重新安装对我有用。
      【解决方案8】:

      我知道这可能有点麻烦,但这是一个解决方案。当我需要实现 Bcrypt 时,我所做的是启动了一个 Cloud 9 实例。对于那些不知道的人,Cloud9 是一个在 EC2 实例上运行的基本 AWS IDE。从 Cloud9,您可以将代码作为 lambda 函数上传到 ide。所以我在Cloud9上写了这个函数,当我上传的时候,代码就可以了。

      【讨论】:

        【解决方案9】:

        如果您在 Docker 中,我可以通过登录到运行我的服务并运行 npm uninstall bcrypt 然后运行 ​​npm install bcrypt 来解决问题

        【讨论】:

          【解决方案10】:

          将包更改为:

          npm install bcryptjs
          
          var bcrypt = require('bcryptjs');
          

          功能相同。

          在此处获取更多信息https://github.com/dcodeIO/bcrypt.js

          【讨论】:

            【解决方案11】:

            我遇到了同样的问题。我使用 windows 在 AWS Lambda 中通过代码部署。我得到了同样的错误。我使用 'bcryptjs' npm 库修复了它。

            npm install bcryptjs

            【讨论】:

              【解决方案12】:

              我通常使用macOS和Docker,添加一些包我首先进入Docker服务器docker exec -it nameServer /bin/bash然后添加包npm install bcrypt。所以我保证一切都会在生产服务器上运行

              【讨论】:

                【解决方案13】:

                在我的情况下,我在 Windows 中使用 nodejs,当我使用 docker(使用 linux)时出现该错误,添加带有 node_modules 文件夹的 .dockerignore 文件和这样我就可以正常工作了,windows中的nodejs包在linux中的加载方式不同,所以最好在linux中从头开始安装它们。

                【讨论】:

                  猜你喜欢
                  • 2017-08-06
                  • 2013-07-28
                  • 2015-06-14
                  • 2023-03-08
                  • 2015-11-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-18
                  • 2020-09-10
                  相关资源
                  最近更新 更多