私は自分のカスタム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
のために正しいです
これらのスクリプトをVM内で実行する必要があるのはなぜですか?彼らはサードパーティーによって提供されていますか(それで、あなたはそれらを実行するために何らかの種類のサンドボックスが必要です)? – robertklep
これは現在私自身のスクリプトですが、サードパーティ製のスクリプトでもWebサーバーを安全にすることを意図しています。 VMに固有のサンドボックスの概念は、最初に発見したときのチケットのように聞こえました。 さらに、VMを使用すると、上述のように、公式ノードである多数のnode.js子プロセスが生成されるのを避けることができます.jsのドキュメントではスケーラビリティとリソース消費について悪い考え方があると警告しています。 –
その場合、 '' vm2'(https://github.com/patriksimek/vm2)を見てください。これは 'vm'と似ていますが、制御が簡単です。 – robertklep