一开始运行简单的Node.js脚本时出现无效的ELF头文件。

5

我想在Ubuntu 14.04上运行一个简单的nodejs脚本,其内容如下:

http = require('http');

http.createServer(function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain' });
  res.end('Hello World \n');
}).listen(80, '127.0.0.1');

我已经按照这里的说明安装了NodeJs。以下是我从该链接中遵循的摘录:

选项2:使用Ubuntu软件包管理器安装Node.js

要安装Node.js,请在终端中键入以下命令:

sudo apt-get install nodejs

然后安装Node包管理器npm:

sudo apt-get install npm

为node创建一个符号链接,因为许多Node.js工具使用此名称来执行。

sudo ln -s /usr/bin/nodejs /usr/bin/node

我已经完成了以上步骤,并验证了两个软件包都已安装:

enter image description here

但是如果没有它,我无法使用我的.node文件,因为会出现以下错误:
user@host:/var/www/html/nodetest$ node test.node

module.js:356
  Module._extensions[extension](this, filename);
                               ^
Error: /var/www/html/nodetest/test.node: invalid ELF header
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:945:3

我已经卸载和重新安装了Node和npm,但它仍然无法工作...我正在运行Ubuntu 14.04 LTS 64位。
更多信息:
我决定从源代码构建,在克隆https://github.com/nodejs/node.git的主分支并构建后运行相同的脚本,出现以下错误:
user@host:/var/www/html/nodetest$ ~/node/node test.node
module.js:600
  return process.dlopen(module, path._makeLong(filename));
                 ^

Error: /var/www/html/nodetest/test.node: invalid ELF header
    at Object.Module._extensions..node (module.js:600:18)
    at Module.load (module.js:490:32)
    at tryModuleLoad (module.js:449:12)
    at Function.Module._load (module.js:441:3)
    at Module.runMain (module.js:607:10)
    at run (bootstrap_node.js:414:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:529:3

显然,这是相同的错误,只是堆栈跟踪不同。

怎么回事?


控制台输出引用会比图像看起来更好,这是因为图像引入了太多的对比度(而且我可以看到你没有在VM下运行它,没有可用的复制粘贴)。 - agg3l
只是一个猜测 - 它可能与您的脚本文件编码有关,导致 node.js 无法解释?例如 UTF8+BOM 或 UTF16... - agg3l
我刚刚在我的运行Raspbian Jessie的树莓派上尝试了相同的步骤,发生了完全相同的事情。我还没有检查文件的编码,但是nodejs需要什么编码? - Brandon
file -i returns us-ascii - Brandon
1个回答

7

这真是令人尴尬(实际上有点气愤)。

无效的ELF头

只是NodeJS告诉我文件扩展名不正确的一种花哨的方式。

我运行了

mv test.node test.js

将文件重命名后,现在它可以正常工作了。由于错误消息不好,这浪费了我两天时间。

来自评论中robertklep的进一步解释:

.node文件扩展名对于Node来说具有特殊含义,因为它应该用于本地(编译)插件。 “ELF头”部分是指动态加载器(错误堆栈中的process.dlopen())如何识别文件为编译插件。由于您输入的是JS文件,因此识别失败,因此出现“无效的ELF头”。 这并没有说明JS文件有任何问题,在您将其重命名后,它可以正常工作。


文件扩展名.node对于Node具有特殊意义,因为它应该用于本地(编译的)插件。 - robertklep
@robertklep 这太棒了。现在我明白了。所以如果我理解正确的话,它告诉我如果我想运行一个.node文件,我的ELF头部不正确。并不是文件本身格式有误。 - Brandon
1
“ELF header” 部分指的是动态加载器(错误堆栈中的 process.dlopen())如何识别文件是否为编译的插件。由于您提供的是 JS 文件,因此无法识别,因此出现了“无效的 ELF header”错误。这并不意味着 JS 文件有问题,只是在重命名后它可以正常工作:D - robertklep
这真是太有趣了。你显然比我更懂这个。如果你想回答这个问题,我会将其标记为正确答案。 - Brandon
不用了,我会给你的答案点赞,因为它是正确的(而且很棒,你能解决这个问题真是太好了,尽管我理解这可能会带来的挫败感!) - robertklep
听起来不错。我会在答案中总结,希望能帮助其他人。非常感谢。 - Brandon

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