103

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

4

13 回答 13

181

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

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

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

于 2013-12-15T01:30:22.623 回答
24

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

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

于 2019-10-25T15:42:22.930 回答
18

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

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

于 2020-02-12T17:33:36.687 回答
10

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

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 模块将顺利安装。

于 2020-06-18T07:31:02.370 回答
9

我也面临与 bcrypt v.1.0.3 相同的问题。刚刚更新到最新版本(3.0.1),现在工作正常

npm install bcrypt@latest --save
于 2018-10-17T12:13:36.440 回答
2

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

于 2021-09-03T04:21:24.370 回答
2

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

npm install bcryptjs

于 2021-07-01T04:46:11.440 回答
1

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

于 2021-02-06T12:28:42.533 回答
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 以根用户身份运行并允许安装完成。.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

于 2020-06-18T04:05:22.717 回答
0

对于那些将应用程序部署到 AWS 弹性 beantalk 并在服务器上安装 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
于 2018-12-17T02:20:23.080 回答
0

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

于 2020-07-13T22:05:26.457 回答
0

将包更改为:

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

功能是一样的。

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

于 2021-06-19T21:34:29.210 回答
-1

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

于 2021-07-08T17:49:41.077 回答