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

我有一个需要运行节点脚本的rails应用程序。 我想使用ExecJS gem是从轨道应用程序运行js的最简单的方法。 不过,迄今为止,ExecJS已经被certificate是非常令人沮丧的使用。

这里是我需要运行的脚本:

// 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) 

从我的导轨控制台,我试试这个:

 [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提供的反引号语法运行脚本:

 `node test.js` 

但是,这感觉就像一个黑客…

任何接受者?

这是错误的,因为EvalJS不支持require()。 'require'是未定义的,而undefined不是一个函数。 ;)

我不确定的答案,但也许你需要确定exec_js_runtime环境variables是节点。

ENV['EXECJS_RUNTIME'] = 'Node'你可以尝试把它放在config / boot.rb中,或者只是在你的环境中定义EXECJS_RUNTIME,就像export EXECJS_RUNTIME=Node

希望能帮助到你

ExecJS的人说使用commonjs.rb https://github.com/cowboyd/commonjs.rb

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

ExecJS为任何JavaScript运行时提供了最低公分母接口。 如果要访问Node API,那么使用ExecJS时,无论您的代码在哪个JavaScript解释器中运行,都应该检查另一个库,如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' 

为模块查找工作Oo,如果我试图指向pathnode_modules文件夹那么它将不可能的gemfindscript (更不用说, #newrequire基本上是唯一logging的方法 – 只有方法afaik – 和#new被误logging:P)

我可以告诉你的选项:

  1. system(node ...) – 你可以使用可卡因来逃避一些问题(pipe道输出,error handling,性能调整,…),并运行一个更干净的语法 – 这不像看起来那么糟糕 – 这就是回形针图像后处理( imagemagick系统包+ cocaine ),所以我想这是非常稳定和非常可行的
  2. 暴露给web api,并在一个免费的heroku dyno上运行一个单独的工作,例如做这个和你想做的节点库类似的东西
  3. 使用prawn 🙂