Node.js v0.11.11 マニュアル & ドキュメンテーション


Executing JavaScript#

Stability: 3 - Stable

次のようにすることで、このモジュールにアクセスすることができます:

var vm = require('vm');

JavaScript コードは、コンパイルされてすぐに実行されるか、コンパイルおよび保存されて後から実行されます。

vm.runInThisContext(code, [options])#

vm.runInThisContext()code をコンパイルして実行し、結果を返します。 実行されるコードはローカルスコープにアクセスしませんが、現在の global オブジェクトにアクセスすることはできます。

vm.runInThisContexteval で同じコードを実行する例:

var localVar = 'initial value';

var vmResult = vm.runInThisContext('localVar = "vm";');
console.log('vmResult: ', vmResult);
console.log('localVar: ', localVar);

var evalResult = eval('localVar = "eval";');
console.log('evalResult: ', evalResult);
console.log('localVar: ', localVar);

// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'

vm.runInThisContext() はローカルスコープにアクセスしないので、 localVar は変更されません。 eval() はローカルスコープにアクセスするので、localVar は変更されます。

この方法では、vm.runInThisContext()間接的な eval 呼び出し とほぼ同じですが (例: (0,eval)('code'))。 しかし、それに加えて以下のオプションがあります。

  • filename: 生成されるスタックトレースに表示されるファイル名を 制御することができます。
  • displayErrors: 例外をスローする前に、エラーの原因となったコードの行を ハイライトして標準エラー出力にプリントするか否か。 code をコンパイルした場合の文法エラーと、コンパイルされたコードを 実行した際のランタイムエラーの両方を捕まえます。
  • timeout: code の実行が終了するまでのミリ秒単位の時間。 もし実行が終了しなければ、Error がスローされます。

vm.createContext([sandbox])#

もし sandbox オブジェクトが与えられると、vm.runInContext()script.runInContext() の呼び出しで利用できるようにサンドボックスを 「コンテキスト化された」します。 実行中のスクリプト内では、sandbox はグローバルオブジェクトとなります。 それは存在するプロパティに加えて、標準の グローバルオブジェクト が持つ組込のオブジェクトや関数などを保持します。 vm モジュールによって実行されているスクリプトの外側では、sandbox は変更されません。

サンドボックスオブジェクトが与えられなかった場合は、 新しくて空のコンテキスト化されたサンドボックスオブジェクトが返されます。

この関数は複数のスクリプトから利用可能なサンドボックスを作るのに便利です。 たとえば、Webブラウザをエミュレートするためにグローバルオブジェクトである window を表現する単一のサンドボックスを作成し、全ての <script> タグを そのサンドボックス内で一緒に実行します。

vm.isContext(sandbox)#

サンドボックスオブジェクトが vm.createContext() によって コンテキスト化されているかどうかを返します。

vm.runInContext(code, contextifiedSandbox, [options])#

vm.runInContext() は、code をコンパイルしてそれを contextifiedSandbox の中で実行し、その結果を返します。 実行されるコードはローカルスコープにアクセスしません。 contextifiedSandbox オブジェクトは vm.createContext() を通じて事前に コンテキスト化されていなければなりません; それは code のグローバルオブジェクトとして使われます。

vm.runInContext()vm.runInThisContext() と同じオプションを受け取ります。

例: 異なるスクリプトを単一の既存コンテキスト中でコンパイルして実行します。

var util = require('util');
var vm = require('vm');

var sandbox = { globalVar: 1 };
vm.createContext(sandbox);

for (var i = 0; i < 10; ++i) {
    vm.runInContext('globalVar *= 2;', sandbox);
}
console.log(util.inspect(sandbox));

// { globalVar: 1024 }

<!- Note that running untrusted code is a tricky business requiring great care. vm.runInContext is quite useful, but safely running untrusted code requires a separate process. -->

信頼できないコードの実行は、細心の注意が求められることに注意してください。 vm.runInContext() は有用ですが、信頼できないコードを安全に実行するには 別のプロセスが必要となります。

vm.runInNewContext(code, [sandbox], [options])#

vm.runInNewContext()code をコンパイルし、sandbox が与えられれば それをコンテキスト化し、または省略された場合は新しいコンテキスト化された サンドボックスを作成し、サンドボックスをグローバルオブジェクトとしてコードを 実行し、その結果を返します。

vm.runInNewContext()vm.runInThisContext() と同じオプションを 受け取ります。

例: コードをコンパイルして実行し、グローバル変数をインクリメントし、 新しい値を設定します。そのグローバルはサンドボックスに含まれます。

var util = require('util');
var vm = require('vm'),

var sandbox = {
  animal: 'cat',
  count: 2
};

vm.runInNewContext('count += 1; name = "kitty"', sandbox);
console.log(util.inspect(sandbox));

// { animal: 'cat', count: 3, name: 'kitty' }

信頼できないコードの実行は、細心の注意が求められることに注意してください。 vm.runInNewContext() は有用ですが、信頼できないコードを安全に実行するには 別のプロセスが必要となります。

Class: Script#

事前にコンパイルされたスクリプトを保持し、指定されたサンドボックス中で 実行するためのクラスです。

new vm.Script(code, options)#

code をコンパイルして新しい Script を作成しますが、実行はしません。 作成された vm.Script オブジェクトはコンパイルされたコードを表現します。 スクリプトは後述するメソッドを使って後から何度でも実行することができます。 返されたスクリプトオブジェクトは、どのグローバルオブジェクトにも 束縛されていません。それは実行される前に、その実行だけに束縛されます。

スクリプトを作成するためのオプションは:

  • filename: 生成されるスタックトレースに表示されるファイル名を 制御することができます。
  • displayErrors: 例外をスローする前に、エラーの原因となったコードの行を ハイライトして標準エラー出力にプリントするか否か。 code をコンパイルした場合の文法エラーにだけ適用されます; コードを実行した際のエラーはスクリプトのメソッドに与えられる オプションによって制御されます。

script.runInThisContext([options])#

vm.runInThisContext() と似ていますが、事前にコンパイルされた Script オブジェクトのメソッドです。script.runInThisContext() はコンパイルされた script のコードを実行し、その結果を返します。 実行されるコードはローカルスコープにアクセスしませんが、現在の global オブジェクトにアクセスすることはできます。

script.runInThisContext() を使ってコードを一度だけコンパイルし、 複数回実行する例:

var vm = require('vm');

global.globalVar = 0;

var script = new vm.Script('globalVar += 1', { filename: 'myfile.vm' });

for (var i = 0; i < 1000; ++i) {
  script.runInThisContext();
}

console.log(globalVar);

// 1000

スクリプトを実行するためのオプションは:

  • displayErrors: 例外をスローする前に、実行時エラーの原因となったコードの行を ハイライトして標準エラー出力にプリントするか否か。 code を実行した場合の実行時エラーにだけ適用されます; Script のコンストラクタが例外をスローするため、文法エラーのある Script のインスタンスを生成することは不可能です。
  • timeout: code の実行が終了するまでのミリ秒単位の時間。 もし実行が終了しなければ、Error がスローされます。

script.runInContext(contextifiedSandbox, [options])#

vm.runInContext() と似ていますが、事前にコンパイルされた Script オブジェクトのメソッドです。script.runInContext() はコンパイルされた script のコードを contextifiedSandbox の中で実行し、その結果を返します。 実行されるコードはローカルスコープにアクセスしません。

script.runInContext()script.runInThisContext() と同じオプションを 受け取ります。

例: コードをコンパイルして実行し、グローバル変数をインクリメントし、 新しい値を設定します。そのグローバルはサンドボックスに含まれます。

var util = require('util');
var vm = require('vm');

var sandbox = {
  animal: 'cat',
  count: 2
};

var script = new vm.Script('count += 1; name = "kitty"');

for (var i = 0; i < 10; ++i) {
  script.runInContext(sandbox);
}

console.log(util.inspect(sandbox));

// { animal: 'cat', count: 12, name: 'kitty' }

信頼できないコードの実行は、細心の注意が求められることに注意してください。 script.runInContext() は有用ですが、信頼できないコードを安全に実行するには 別のプロセスが必要となります。

script.runInNewContext([sandbox], [options])#

vm.runInNewContext() と似ていますが、事前にコンパイルされた Script オブジェクトのメソッドです。 script.runInNewContext() は、sandbox が与えられればそれをコンテキスト化し、 または省略された場合は新しいコンテキスト化されたサンドボックスを作成し、 サンドボックスをグローバルオブジェクトとして script のコンパイルされたコードを 実行し、その結果を返します。 実行されるコードはローカルスコープにアクセスしません。

script.runInNewContext()script.runInThisContext() と同じオプションを 受け取ります。

例: グローバル変数を設定するコードをコンパイルし、異なったコンテキストで 複数回実行します。それらのグローバルはそれぞれのサンドボックスに設定されます。

var util = require('util');
var vm = require('vm');

var sandboxes = [{}, {}, {}];

var script = new vm.Script('globalVar = "set"');

sandboxes.forEach(function (sandbox) {
  script.runInNewContext(sandbox);
});

console.log(util.inspect(sandboxes));

// [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]

信頼できないコードの実行は、細心の注意が求められることに注意してください。 script.runInNewContext() は有用ですが、信頼できないコードを安全に実行するには 別のプロセスが必要となります。