2016-10-25 5 views
1

私は自分のカスタムnode.jsサーバーを作成しています。これは静的ページ、AJAX GET、POST、OPTIONSリクエストを処理します(後者はCORS用です)。しかし、サーバー側のGETスクリプトとPOSTスクリプトを実行するために選択した方法は最適ではありません - 公式のnode.jsドキュメントには、多くの子ノードnode.jsプロセスを起動することは、リソースが不足しているため、悪い考えです。それはうまくいきますが、おそらく同じ結果を達成するためのより良い方法があることを認識しています。VMモジュールを使用してNode.jsスクリプトを実行する:「ReferenceError:requireは関数ではありません」

私はVMモジュールを拝見しました。私の最初の考えは、子プロセスを持つマシンを混乱させる問題を解決し、サーバーをよりスケーラブルにすることでした。

少し問題があります。私のサーバー側のスクリプトは、ディレクトリリスト&のようなタスクのために、ブラウザに結果を送り返し、いくつかのから始まり、必要なモジュールをロードするためにステートメントが必要です。

は、最終的には、スクリプトファイルを読み込み、vm.Script(に渡す)、私は今、エラーが発生するコードを書いた:

:私は「

「にReferenceErrorが必要機能ではありません」この理由は、独立したnode.js実行環境の代わりに、VMがスクリプトのための裸のV8実行環境を起動するということを知ってからです。私の考えを働かせるためには、VMに別のサンドボックス化されたnode.js実行環境を提供する必要があります。これをどのように達成するのですか?

私の予備調査では、にはが意図した通りに機能するように、VM実行環境にnode.jsグローバルの別個のコピーを提供する必要があることがわかります。私の理解は正しかったか?もしそうなら、この作業を実行するためにはどのようなステップが必要ですか? (runInThisContextではなく)「親」のコンテキストでグローバルを共有しない、runInNewContextのために正しいです

+0

これらのスクリプトをVM内で実行する必要があるのはなぜですか?彼らはサードパーティーによって提供されていますか(それで、あなたはそれらを実行するために何らかの種類のサンドボックスが必要です)? – robertklep

+0

これは現在私自身のスクリプトですが、サードパーティ製のスクリプトでもWebサーバーを安全にすることを意図しています。 VMに固有のサンドボックスの概念は、最初に発見したときのチケットのように聞こえました。 さらに、VMを使用すると、上述のように、公式ノードである多数のnode.js子プロセスが生成されるのを避けることができます.jsのドキュメントではスケーラビリティとリソース消費について悪い考え方があると警告しています。 –

+0

その場合、 '' vm2'(https://github.com/patriksimek/vm2)を見てください。これは 'vm'と似ていますが、制御が簡単です。 – robertklep

答えて

3

My preliminary researches tell me that I need to provide the VM execution environment with its own separate copy of the node.js globals, so that require functions as intended

スクリプトにrequireの機能を提供するには、それを関数として渡すことができます。同じことがconsoleのような他の地元の人々のために行く:

const vm = require('vm'); 

let sandbox = { 
    require, 
    console 
}; 

vm.runInNewContext(` 

let util = require('util'); 
console.log(util.inspect(util)); 

`, sandbox); 

代わりの直接requireを渡して、あなたも(あなたがスクリプトをロードするために許可されているモジュールを制御することができます)、と言うことを、実装モジュールのホワイトリストを関数を渡すことができます。

+0

ブリリアントこれはちょうど私が必要と思われる!私は今試してみましょう! –

+0

これが解決されました。あなたの提案は完全に機能しました。スクリプトでrequireを使用できるようになりました。今度は次の問題に進みます。 :) –

関連する問題