Techioz Blog

ExecJSを使用してRailsアプリからNode.jsスクリプトを呼び出す

概要

ノードスクリプトを実行する必要がある Rails アプリケーションがあります。 Rails アプリから JavaScript を実行するには、ExecJS gem を使用するのが最もクリーンな方法だと思います。ただし、これまでのところ、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 が提供するバックティック構文を使用してスクリプトを実行することもできることに注意してください。

`node test.js`

でも、それはハックのような気がします…

解決策

require() が EvalJS でサポートされていないため、エラーが発生します。 ‘require’ は未定義であり、未定義は関数ではありません。 ;)