运行节点应用程序时bcrypt无效的elf标头

时间:2013-04-04 11:15:28

标签: node.js elf bcrypt

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

12 个答案:

答案 0 :(得分:132)

我发现在OSX上编译的 bcrypt在Linux上不能正常工作。换句话说,如果您检查在本地OSX工作站上编译的bcrypt,并尝试在Linux服务器上运行节点应用程序,您将看到上面的错误。

解决方案:Linux上的npm install bcrypt,检查一下,解决了。

处理此问题的最佳方法可能是排除.gitignore中的node_modules ...以及远程安装npm。

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

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

运行

void Problem::SetParameterBlockConstant(double *values)

答案 3 :(得分:1)

如果您像我一样在docker容器中运行,则只需要在其中指定'node_modules'的.dockerignore。

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

答案 4 :(得分:1)

首先请确保您没有上载节点模块,并且正在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以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

答案 5 :(得分:1)

有一种简单的方法可以解决此问题:

1。卸载bcrypt

npm uninstall bcrypt

2.-重新安装bcrypt

 npm i bcrypt

发生错误是因为,当您安装bcypt时,npm会为您的计算机和操作系统安装推荐的版本,但是当您在另一台计算机上时,则不起作用

答案 6 :(得分:1)

如果您使用的是 Docker,我会通过登录到运行我的服务的机器并运行 npm uninstall bcrypt 然后 npm install bcrypt

来解决该问题

答案 7 :(得分:0)

对于那些将应用程序部署到AWS Elastic Beanstalk并要在服务器上安装bcrypt的用户,请在.ebextensions/01_build.config中的post post挂钩中添加

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

答案 8 :(得分:0)

我知道这可能有点麻烦,但这是一个解决方案。当我需要实现Bcrypt时,我要做的就是启动一个Cloud 9实例。对于不认识的人,Cloud9是运行在EC2实例上的基本AWS IDE。从Cloud9,您可以将代码作为Lambda函数上传到ide上。因此,我在Cloud9上编写了该函数,并在上载该代码后起作用。

答案 9 :(得分:0)

将包更改为:

struct UnBrokenView: View {
    @StateObject var model = Observable(Model()) // wrap in Observable

    var body: some View {
        Text(model.number)
        Button("Change") {
           model.number = ["One", "Two", "Three", "Four", "Five", "Six"].randomElement()!
        }
    }
}
npm install bcryptjs

功能相同。

在此处获取更多信息flush=True

答案 10 :(得分:0)

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

npm install bcryptjs

答案 11 :(得分:-1)

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