2016-05-13 4 views
0

私はcontextify(https://www.npmjs.com/package/contextify)を使用して、ノードサンドボックスで非同期の「信頼できない」スクリプトを実行しています。同じ問題がノード0.12+ vm.runInContext()にも適用されます。contextifyを使用してノードvm内から非同期結果を返す

Contextify = require('contextify'); 
rp = require('request-promise'); 

var myCode = "rp('http://www.google.com').then(function (htmlString) { RESULT = htmlString })" 
defaultContext = { rp: rp, setTimeout : setTimeout, console: console } 

vm = Contextify(defaultContext) 
vm.run(myCode); 

vm.RESULT 
//undefined 

任意の文書化されていない機能、またはVMはすべてを実行したとき、私は知ることができたイベントはありますか? または、このリクエスト・プロミス関数をラップしてvmの外側にメッセージを得る巧妙な方法はありますか?

答えて

2

匿名関数を作成して、渡すコールバックを処理するだけです。

Contextify = require('contextify'); 
rp = require('request-promise'); 

var myCode = "function(callback) { rp('http://www.google.com').then(callback); }" 
defaultContext = { rp: rp, setTimeout : setTimeout, console: console } 

vm = Contextify(defaultContext) 
vm.run(myCode)(function(htmlString) { 
    // Do what you need here 
    }); 

しかし、コードを本当に信頼しない場合は、コールバック自体が変更されないようにするために2次の匿名関数を作成します。

+0

ありがとう@ジョナサングレー、いい考えです。問題の一部は、このmyCodeがユーザーによって生成されていることです。私は、関数をラップするために検出される可能性のあるパターンがあるかどうかはわかりません。最も簡単なユースケースは、動作可能なリクエスト可能スクリプトを解析する方法を提案できますか?ありがとうございました – LPG

+0

@ LPGこれはうまくいかないユースケースですか? \ n "+ myCode +" \ n} "'など、ユーザーのコードを単純にラップすることができます。そして、渡されたものはすべて共有されます。たとえば、空のオブジェクトを渡すことができます。オブジェクトが変更されている場合は、コールバックの変更を取得することができます( 'done'のような' callback'にもっと実用的な名前を付けることができます)。 –

+0

コードは非常に役に立ちます。具体的には、私は書き換えられなかったレガシーコードを扱っています。私は将来の読者のためのいくつかの変更を提案しますが。この例はcontextifyで失敗します。これは関数を括弧で囲む必要があります:var myCode = "(function(callback){" + userCode + "})"また、私のコールケースでは、コールバックだけでジョブの完了をマークすることになります。同様に、var myCode = "(x = 1; function(callback){rp( 'http://www.google.com').then(function(){x = 2; callback()}))} "vm = Contextify(defaultContext); vm.run(myCode)(function(){jobIsComplete = true}); – LPG

関連する問題