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


87

我正在为学校设计一个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上,我试图在Google上找到解决方案,但没有成功...有人可以帮助我吗?


您找到解决方案了吗?
MrYoshiji 2013年

是的,我安装了ubuntu 12.04,并且能够安装和使用bcrypt。感谢您对我的问题感兴趣。
user2244469

Answers:


163

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

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

解决此问题的最佳方法可能是排除.gitignore ...中的node_modules ...并远程安装npm。


3
那是因为它们是不同的操作系统,并且很有可能是不同的底层处理器体系结构。当我上大学时,我们有两个UNIX群集:一个在VAX上运行,另一个在Alpha上运行。CS计划将HAD编译在VAX上,因为那是教授所使用的...
tkone 2014年

@tkone可以,但是npm模块可以交叉编译:使用二进制组件安装somthing可以得到Mach(OS X),ELF(Linux)和PXE(Windows)二进制文件。
mikemaccana 2014年

1
唯一的问题是:与其他节点模块不同,bcrypt仅安装单个OS二进制文件。因此,由于node_modules / bcrypt / build / Release / bcrypt_lib.node现在是Linux二进制文件,因此提交Linux安装的bcrypt将破坏您的Mac开发人员系统。运行file /Users/mikemaccana/Documents/sandpitlab/waves/node_modules/bcrypt/build/Release/bcrypt_lib.node测试。
mikemaccana 2014年

@mikemaccana他们当然不会。我们将vmware和ubuntu用于开发,但与我们的Mac共享。socket.io,leveldb,phantomsj等都针对要安装到的目标体系结构进行编译。如果我在Mac上安装了level并尝试从VM使用它,则它将完全失败,因为它是为darwin而不是linux编译的。
tkone

2
@mikemaccana节点青菜只能是因为(从readme.md) Node-sass includes pre-compiled binaries for popular platforms, to add a binary for your platform follow these steps:。它不是交叉编译,而是为您提供了预编译的二进制文件。默认情况下,Node-gyp不会交叉编译。
tkone 2014年

13

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

一些库需要在主机上进行编译,因此您的模块可能会过时。


1
这是我的问题。bcrypt建立在MacOS X上,但是在Linux容器中运行。
Nate Reed

7

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

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


6

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

npm install bcrypt@latest --save

谢谢,这解决了这个问题,(我正在MacOS上进行编程,并将其部署在Ubuntu服务器上!)
Rakshitha Muranga Rodrigo 18/12/14

1
在MacOS中,这对我不起作用(我正在使用v3.0.4)
jordins,

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


1

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

1.卸载bcrypt

npm uninstall bcrypt

2.-再次安装bcrypt

 npm i bcrypt

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


这实际上对我有用。谢谢
弗朗西斯

0

对于那些将应用程序部署到AWS Elastic beantalk并要在服务器上安装bcrypt的用户,请在post post挂钩中包括.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

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.