Rails / execjs找不到Node.js

7

我通过编译和安装来自root用户的node.js。我认为这可能是问题所在。从运行rails应用程序的用户中,我检查了node.js。

$ which node
/usr/local/bin/node

当我启动我的Rails应用程序(Rails 3.2.9)时,我得到了一个普遍无用的“抱歉,但出现了一些问题。”检查生产错误日志,我发现找不到Javascript运行时。这很令人困惑,因为显然已经安装了它。所以我开始强制使用Node Javascript运行时。我编辑了config/boot.rb文件,包含以下内容:

ENV['EXECJS_RUNTIME'] = 'Node'

我再次检查了我的应用程序,并观察生产日志。这一次,我遇到了错误。
ActionView::Template::Error (Node.js (V8) runtime is not available on this system

还是感到困惑。我去了execjs gem并把运行命令改成了精确的安装路径。

Node = ExternalRuntime.new(
  :name        => "Node.js (V8)",
  :command     => "/usr/local/bin/node",
  :runner_path => ExecJS.root + "/support/node_runner.js",
  :encoding    => 'UTF-8'
)

我仍然遇到相同的错误。Node已经安装并且用户可以访问,但是gem/rails似乎无法使用它。 服务器运行的是CentOS 6.3。导致抛出错误的特定JavaScript文件是jquery.nivo.slider.pack.js。我从nivo下载后没有进行编辑。


1
你的解决方案对我很有用。我有一个 Fedora 盒子,并使用 Phusion Passenger 服务于一个应用程序。但是,如你上面所指示的那样,当我更改运行时命令后,我必须重新启动应用程序才能使其生效。 - Nick_K
3个回答

6

所以,我在CentOS 5.10上使用Apache2和Passenger安装了Ruby 2.0.0和Rails 4.0.2。我的第一步尝试是打开rails控制台并输入以下命令:

ExecJS.runtime

它返回以下值:

#<ExecJS::ExternalRuntime:0x99ab380 @name="Node.js (V8)", @command=["nodejs", "node"],@runner_path="/home/foo/vendor/bundle/ruby/2.0.0/gems/execjs-2.1.0 /lib/execjs/support/node_runner.js", @encoding="UTF-8", @deprecated=false, @binary="node">

这意味着已经安装并检测到了Node,但由于某种原因它无法工作。
所以,我在网站上尝试了一下示例:
ExecJS.eval("'red yellow blue'.split(' ')")

我得到了正确的响应,但是现在我想知道为什么Passenger没有捕捉到它。

然后,我注意到Passenger显示了路径变量,看起来像这样:

/home/foo/vendor/bundle/ruby/2.0.0/bin:/usr/local/rvm/gems/ruby-2.0.0-p481/bin:/usr/local/rvm/gems/ruby-2.0.0-p481@global/bin:/usr/local/rvm/rubies/ruby-2.0.0-p481/bin:/usr/kerberos/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/rvm/bin:/home/foo/bin

但是,似乎缺少usr/local/bin。 对于我这样的Linux新手来说,最简单的修复方法是使用符号链接。 因此,我执行ln -s /usr/local/bin/node /usr/bin/node。 你可能想注意,我使用命令find / -name node找到了我的nodejs路径。

然后,我刷新了我的Web应用程序,结果它起作用了。 所以,如果对我有用,我希望它也能帮助其他人。

更新(可能更好的方法): 这可能是更好的方法。 我们可以这样从源代码编译:

mkdir ~/install
cd ~/install
wget https://nodejs.org/dist/v7.2.1/node-v7.2.1.tar.gz
tar xvf node-v7.2.1.tar.gz
cd node-v7.2.1
./configure --prefix=/usr/
make && make install

这样安装Node.js时,将会安装到Passenger所期望的路径中。


好吧,我搜索了几个小时才找到这个。我的NodeJS已经完全安装,你的解决方案解决了我的问题。虽然使用符号链接看起来不是最好的解决方案...无论如何,谢谢! - cyber101
你在哪里看到Passenger正在寻找不同路径中的节点? - simo
@simo 这已经是5年前的事情了,所以我不记得了,但我认为它是在按照上面列出的命令后在控制台中显示的。 - Travis Pessetto

1
我在我的CentOS 6.3系统上安装nodejs的源时遇到了类似的问题。它已经成功安装,但我一直无法编译我的ror应用程序资产,直到我明确将PATH设置为安装位置(nodejs)。
[root]#make install ... 安装/ usr / local / lib / node_modules / npm / html / doc / folders.html 符号链接../lib/node_modules/npm/bin/npm-cli.js->/usr/local/bin/npm 更新/usr/local/bin/npm的shebang为/usr/local/bin/node [root]#export PATH = /usr/local/bin:$ PATH
现在它可以正常工作了。希望这有所帮助!

0

我不知道这是否有帮助,但请检查您的$PATH中是否包含node。此外,如果您想使用node,应该使用rvm。请检查您的node安装是否正确。


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