运行Node应用程序时出现bcrypt无效的ELF头。

130

我正在为学校的一个nodejs项目工作。 我无法使用npm安装bcrypt,所以我安装了bcrypt-nodejs,而且昨天该项目运行良好。 但是今天,当我执行“node app”时,我遇到以下错误:

/.../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上尝试找到解决方案但没有成功... 有人能帮助我吗?


是的,我安装了Ubuntu 12.04并能够安装和使用bcrypt。感谢您对我的问题的关注。 - user2244469
15个回答

1
首先确保您不会上传node模块,并在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。

0
可能是架构上的差异,我在谷歌计算引擎上运行这个命令时使用了谷歌CLI Putty或谷歌终端。
npm uninstall bcrypt

那么

npm i bcrypt

这应该解决了


0

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


0

对于那些将应用部署到AWS弹性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

-2

我通常使用带有 Docker 的 macOS,在添加一些软件包时,首先进入 Docker 服务器 docker exec -it nameServer /bin/bash 然后添加软件包,例如 npm install bcrypt。这样我可以保证所有内容都可以在生产服务器上运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接