0

別の退屈な問題で再び戻ってきます。問題の前に文脈を説明すると簡単です。「入力」を介して内部から自分自身をプログラムできるようにするプロジェクトを(Node.JSで)構築しようとしています(これはネットワーク/コンソールまたは実際には何でもかまいませんが、これにはコンソールを介して仮定します)。

それでは、オブジェクトがあるとしましょう:

var database = {
    'test': 123
}

コンソールから次のように入力します。

;database.myFunc = function() { return database.test; }

これを使用して実行しvm.runInContext、後でデータベース オブジェクトにコピーして戻します (非特権ユーザーが実行しているため、サンドボックス化する必要があります)。これは正常に機能し、次のコマンドで実行するとコードは正常に機能します。

;database.myFunc()
=> 123

これまでのところすべて順調です。この時点で、関数を文字列 ( ) としてエクスポートできる独自のオブジェクト ダンパーを作成しvar str = new String(database.myFunc)ました。これは動作し、それらを文字列としてエクスポートします。

この問題は、ファイルからコードをインポートするときに発生します。私はこのようなコードを試しました:

code = "retval = " + data.toString();
sandbox = vm.createContext({
    "database": sb.database
});
result = vm.runInNewContext(code, sandbox);
sb.database = result;
console.log(sb.database.myfunc());

実行されるコードのように見えますが、サンドボックスにコピーしたデータベースにのみアクセスできます。これは私が望んでいるものではありません。最初の実行時に持っていたのと同じ DB にアクセスしたいのです。私がそれをどのように行うかについての提案はありますか?

4

1 に答える 1

0

名前が示すように、vm.runInNewContext呼び出すたびに異なるコンテキストを作成します。だから、それを使用しないでください !代わりに、vm.createContext(1 回のみ) with を使用しvm.runInContextます。contextによって返されるへの参照を維持する必要がありますcreateContext()

于 2013-09-03T17:39:21.057 に答える