运行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个回答

204
我发现在OSX上编译的bcrypt无法完全在Linux上工作。换句话说,如果您将在OSX本地工作站上编译的bcrypt检入代码库,并尝试在Linux服务器上运行节点应用程序,则会出现上述错误。
解决方案:在Linux上执行“npm install bcrypt”,然后检查并保存即可解决问题。
最好的解决方法可能是在.gitignore中排除您的node_modules,并在远程执行npm安装。

3
这是因为它们是不同的操作系统,很可能也是不同的底层处理器架构。我在大学时我们有两个UNIX集群:一个运行在VAX上,另一个运行在Alpha上。计算机科学项目必须在VAX上进行编译,因为那是教授使用的平台... - tkone
@tkone 当然可以,但是npm模块交叉编译:安装带有二进制组件的内容会给你提供一个Mach(OS X)、ELF(Linux)和PXE(Windows)二进制文件。 - mikemaccana
1
唯一的问题是:bcrypt与其他Node模块不同,只安装单个操作系统二进制文件。因此,提交已在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
@mikemaccana,当然不会。我们使用VMware和Ubuntu进行开发,但与我们的Mac共享。Socket.io、LevelDB、PhantomJS等都会编译到你要安装的目标架构上。如果我在我的Mac上安装Level并尝试从虚拟机中使用它,它将完全失败,因为它是为Darwin而不是Linux编译的。 - tkone
2
@mikemaccana,node-sass 之所以能够工作,是因为(来自 readme.md):Node-sass 包含了流行平台的预编译二进制文件,要为您的平台添加二进制文件,请按照以下步骤操作:。它不是交叉编译,而是提供预编译的二进制文件。Node-gyp 默认情况下不进行交叉编译。 - tkone
显示剩余2条评论

41
如果您像我一样在Docker容器内运行,您只需要一个包含“node_modules”指定的 .dockerignore 文件。
某些库需要在主机上编译,因此您的模块可能过时。

6
这是我的问题。bcrypt 是在 MacOS X 上构建的,但需要在 Linux 容器中运行。 - Nate Reed
3
非常感谢你,因为这个问题让我苦思冥想了很长时间。 - Jeet
这节省了我的时间。谢谢。 - Dinesh

32

我的问题出在docker-compose.yml文件上,我已经在.dockerignore文件中排除了node_modules目录,但是我还需要将node_modules作为一个卷添加进去:

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


2
不知道为什么,但只有这个解决方案对我起作用了!谢谢! - bennyxguo
我使用带有容器节点:bind的Windows,只有这种解决方案对我有效。 - Marcon Willian
对我来说也是一样,我使用带有 Docker 的 Windows,不知道为什么,但这个解决方案对我也起作用了。谢谢。 - Argoitz
1
不是 Windows 平台,对我很有用,谢谢。我已经像你一样将我的 node_modules 目录提交到版本控制系统了。 - Julien

20

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

1. 卸载bcrypt

npm uninstall bcrypt

2.- 再次安装bcrypt

 npm i bcrypt

错误是由于安装bcrypt时,npm会为您的计算机和操作系统安装推荐版本,但在其他计算机上可能不起作用。

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

对我来说似乎还有另一种解决方案,即授予bcrypt安装root权限,这是因为bcrypt使用自己的用户但没有权限,因此:

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

sudo su

然后输入您的根密码以获得根用户权限

2. 授予项目文件夹权限

chmod -R 777 <project_folder>

3. 前往您的项目文件夹并安装bcrypt

cd <project_folder>

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

准备好了,如果一切正常,您的bcrypt模块将会无问题地安装。


当强制标志无效时,卸载和重新安装对我有用。 - Ben Thielker
对我来说很有效。谢谢你。 - Riski Nurohman

14
我遇到了同样的问题。我在使用Windows时,在 AWS Lambda 上部署了我的代码,出现了相同的错误。我使用“bcryptjs”npm库解决了这个问题。
npm install bcryptjs

9
我之前遇到了与 bcrypt v.1.0.3 相同的问题。 我刚刚更新到最新版本 (3.0.1) ,现在它运行正常。
运行:
npm install bcrypt@latest --save

问题已解决,谢谢!(我在MacOS上编程,然后部署到Ubuntu服务器上!) - Rakshitha Muranga Rodrigo
2
在我的MacOS上,这个不起作用(我使用的是v3.0.4)。 - jordins
这对我不起作用,我在MacOS中使用v5.0.0。 - therightstuff

7

4
在我的情况下,我正在使用 Windows 上的 nodejs,在使用 Docker(与 Linux 一起)时,我遇到了这个错误,添加 .dockerignore 文件并将 node_modules 文件夹加入其中后,问题得到了解决。在 Linux 中,Windows 上的 nodejs 包的加载方式不同,因此最好从头开始在 Linux 上安装它们。

4
为了解决Docker容器的这个问题,您可以创建一个具有以下配置的.dockerignore文件:
node_modules/
dist/

3

如果您使用的是Docker,则可以通过登录到运行服务的机器并运行npm uninstall bcrypt,然后运行npm install bcrypt来解决该问题。


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