2014-04-04 70 views
8

我有一個需要運行節點腳本的rails應用程序。我想使用ExecJS gem是從Rails應用程序運行js的最簡單的方法。但是,迄今爲止,ExecJS已被證明使用起來非常令人沮喪。使用ExecJS從Rails應用程序調用Node.js腳本

這裏是我需要運行該腳本:

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

注意,我可以成功地使用「節點test.js運行此腳本'我也能運行使用反斜槓語法的腳本使用ruby提供的反向語法:

`node test.js` 

但是,感覺就像一個hac k ...

任何接受者?

+1

聽起來像一個偉大的使用案例微服務做類似的東西。有一個Node.js服務器參加Rails服務器發出的請求! – vemv

+0

這與問題無關,但與代碼相關。如果你想從rails應用程序創建pdf,爲什麼不使用像'prawn'這樣的ruby庫? – hamitron

回答

2

我不確定答案,但可能需要將exec_js_runtime環境變量精確爲節點。

喜歡的東西ENV['EXECJS_RUNTIME'] = 'Node'你可以嘗試把它在config /的boot.rb或只是定義在您的環境中EXECJS_RUNTIME,像export EXECJS_RUNTIME=Node

希望它可以幫助

+0

我不認爲這是問題。我肯定有一個工作節點安裝,我可以運行'ExecJS.eval(「1 + 1」)'沒有任何問題。不管怎麼說,還是要謝謝你。 –

+0

是的,但你確定exec js使用節點而不是另一個運行時? – Oxynum

+0

'ExecJS.runtime'的結果是什麼? – Oxynum

3

它的示數,因爲需要( )不受EvalJS支持。 'require'未定義,undefined不是函數。 ;)

1

ExecJS people say使用commonjs.rbhttps://github.com/cowboyd/commonjs.rb

爲什麼我不能用CommonJS的需要()內ExecJS?

ExecJS提供了JavaScript運行時的任何 的最低公分母接口。如果你想訪問Node API, 應該檢查另一個庫,比如commonjs.rb,用來提供一個 一致的接口,這與使用ExecJS無關。

但基本不起作用。該require行爲完全無規律 - 我不得不在

require 'v8' 
require 'commonjs' 
env = CommonJS::Environment.new(V8::Context.new, path: ::Rails.root) 
env.require 'script' 

env =env.require之間執行npm -g install pdfkit fs的模塊查找工作哦哦,如果我試圖指向pathnode_modules文件夾那麼這將是不可能的寶石找到script(更不用提的是,#newrequire基本上是唯一記載的方法 - 唯一方法AFAIK - 和#new是misdocumented:P)

您的選項,據我可以告訴:

  1. system(node ...) - 您可以使用Cocaine逃避一些疑難雜症的(管道輸出,錯誤處理,性能調整,...),並運行一個更清晰的語法 - 這不是那麼糟糕,因爲它看起來 - 這是曲別針如何做圖像後處理(imagemagick系統包+ cocaine),所以我想這是非常穩定,非常可行
  2. 暴露於網絡的API和運行一個單獨的在免費的Heroku賽道例如工人做到這一點,你想與節點庫
  3. 使用prawn :)
相關問題