Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ExecJS从Rails应用程序调用Node.js脚本_Javascript_Ruby On Rails_Ruby_Node.js_Execjs - Fatal编程技术网

Javascript 使用ExecJS从Rails应用程序调用Node.js脚本

Javascript 使用ExecJS从Rails应用程序调用Node.js脚本,javascript,ruby-on-rails,ruby,node.js,execjs,Javascript,Ruby On Rails,Ruby,Node.js,Execjs,我有一个需要运行节点脚本的Rails应用程序。我认为使用ExecJS gem是从Rails应用程序运行JavaScript的最干净的方法。然而,到目前为止,ExecJS被证明是非常令人沮丧的 以下是我需要运行的脚本: // Generated by CoffeeScript 1.7.1 (function() { var PDFDocument, doc, fs; fs = require("fs"); PDFDocument = require('pdfkit'); doc =

我有一个需要运行节点脚本的Rails应用程序。我认为使用ExecJS gem是从Rails应用程序运行JavaScript的最干净的方法。然而,到目前为止,ExecJS被证明是非常令人沮丧的

以下是我需要运行的脚本:

// Generated by CoffeeScript 1.7.1
(function() {
  var PDFDocument, doc, fs;
  fs = require("fs");
  PDFDocument = require('pdfkit');
  doc = new PDFDocument;
  doc.pipe(fs.createWriteStream('output.pdf'));
  doc.addPage().fontSize(25).text('Here is some vector graphics...', 100, 100);
  doc.save().moveTo(100, 150).lineTo(100, 250).lineTo(200, 250).fill("#FF3300");
  doc.scale(0.6).translate(470, -380).path('M 250,75 L 323,301 131,161 369,161 177,301 z').fill('red', 'even-odd').restore();
  doc.addPage().fillColor("blue").text('Here is a link!', 100, 100).underline(100, 100, 160, 27, {
    color: "#0000FF"
  }).link(100, 100, 160, 27, 'http://google.com/');
  doc.end();
}).call(this)
在Rails控制台中,我尝试以下操作:

[2] pry(main)> file = File.open('test.js').read
[3] pry(main)> ExecJS.eval(file)
ExecJS::ProgramError: TypeError: undefined is not a function
from /Users/matt/.rvm/gems/ruby-2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:68:in `extract_result'
请注意,我可以使用“node test.js”成功运行此脚本,并且还可以使用Ruby提供的backtick语法运行此脚本:

`node test.js`

但这感觉像是一个黑客…

我不确定答案,但可能需要将exec_js_运行时环境变量精确到node

类似于
ENV['EXECJS_RUNTIME']='Node'
您可以尝试将其放在config/boot.rb中,或者只是在您的环境中定义EXECJS_运行时,类似于
export EXECJS_RUNTIME=Node


希望它能有所帮助,因为EvalJS不支持require()require'未定义,且未定义不是函数。;)

使用
commonjs.rb

为什么我不能在ExecJS中使用CommonJS require()

ExecJS为任何应用程序提供了最低的公共分母接口 JavaScript运行时。使用ExecJS时,不管使用哪种JavaScript 解释器:您的代码在其中运行。如果要访问节点API,请 应该检查另一个库,如commonjs.rb,该库旨在提供 一致的接口

但这基本上不起作用。
require
运行完全不稳定-我必须在
env=
env.require
之间执行
npm-g install pdfkit fs

require 'v8'
require 'commonjs'
env = CommonJS::Environment.new(V8::Context.new, path: ::Rails.root )
env.require 'script'
为了使模块查找工作正常,如果我尝试将
path
指向
node\u modules
文件夹,那么gem将无法找到
script
(更不用说
#new
require
基本上是唯一有文档记录的方法-只有方法是正确的-并且
#new
是错误记录的:P)

就我所知,您的选择:

  • system(node…
    -您可以使用它来逃避一些问题(管道输出、错误处理、性能调整等),并运行更简洁的语法-这并不像看上去那么糟糕-这就是曲别针如何进行图像后处理(
    imagemagick
    system-package+
    cookine
    )所以我想这是非常稳定和可行的
  • 公开web api并在一个免费的heroku dyno上运行一个单独的worker,例如,来完成这项工作,以及您希望对节点库执行的类似操作
  • 使用虾

  • 摆脱ExecJS和任何依赖ExecJS的东西。我尝试了所有其他的建议,但这实际上解决了它


    ES6自2015年以来一直存在。现在任何值得使用的工具都支持它。MICROSOFT EDGE现在支持它。说真的。

    我认为这不是问题所在。我肯定有一个工作节点安装,我能够运行“ExecJS.eval”(“1+1”)”没有任何问题。无论如何,谢谢。是的,但是你确定exec js使用的是node而不是另一个运行时吗?
    ExecJS.runtime
    ?[18]pry(main)>ExecJS.runtime=>#这个例子不适用于他们说你应该使用
    commonjs
    gem的人,但它感觉还没有完成——OP的示例脚本执行时没有错误,但没有输出听起来像是微服务的一个很好的用例。让Node.js服务器处理Rails服务器发出的请求!这与问题无关,但与代码相关。如果您试图从rails应用程序创建pdf,为什么不使用诸如“prawn”之类的ruby库呢?@vemv-prawn在以pdf格式呈现运行时图表时非常糟糕。下面是一些分析。