コメントに記載されているように、無限ループによりノードプロセスがフリーズするため、ユーザー提供のモジュールを別のプロセスで実行する必要があります。
VMモジュールから開始する必要があります。
- ファイルの内容を読み取ります (ではなくfs.readFile
require
を使用)。
- 新しいグローバル オブジェクトを定義します。必要なものをすべて公開する (残りは非表示にする) ことができます。
- ユーザー コードを実行します。
次に例を示します。
var fs = require('fs'),
vm = require('vm');
関数 runCode(ファイル名) {
var コード = fs.readFileSync(ファイル名)、
サンドボックス = {
コンソール: コンソール、
setTimeout: setTimeout,
clearTimeout: clearTimeout,
必要: 必要,
モジュール: モジュール、
輸出: 輸出,
プロセス: プロセス、
バッファ: バッファ
};
vm.runInNewContext(コード、サンドボックス、ファイル名);
}
ユーザー提供のコードは、グローバル スコープにあるかのように、サンドボックスで渡したすべてのものにアクセスできます。私の場合、実際の node.js グローバル スコープからほとんどすべてを公開することにしました。公開しないものを選択できます。
また、ソリューションを安全にしたい場合は、child_process.spawnを確認する必要があります。