やあ、
組み込みモジュールがホストからプロキシされ、VMで必要とされない理由を理解しようとしています。
これは現在の私の設定です:
const vm = new NodeVM({
require: {
external: true,
context: 'sandbox',
builtin: ['*'],
},
});
vm.run(...);
VM内では、外部モジュール(重要な場合はaxios
)が必要であり、依存関係のチェーンでは、これを(多かれ少なかれ)行う別のモジュール( follow-redirects
)が必要です。
var Writable = require('stream').Writable;
function RedirectableRequest(options, responseCallback) {
// .....
}
RedirectableRequest.prototype = Object.create(Writable.prototype);
RedirectableRequest.prototype._performRequest = function () { // <-------- this line breaks
// ..........
}
vm内でこのコードを実行すると、次のようになります。TypeError:'set' on proxy:trap return falsish forproperty'_performRequest'。
ストリームオブジェクトはVMにプロキシされています。
stream
が実際に仮想マシン内で必要なときにこのコードを実行する(ここでifステートメントを削除する:https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133)働く。
osxでノード6.10.3を実行しています。
ありがとう
#127に関連
私は先に進み、ifステートメントを次のように変更しました。
if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){
ノード8.xでasync_hooksの問題が発生したことがわかりました
また、別の解決策も見つけました(パラダイムにより適していると思います)。
基本的に私が見つけたのは、コンテキスト化されたコードが、そのコンテキストで作成したオブジェクトのプロトタイプに書き込もうとしていたが、別のコンテキストから持ち込まれたオブジェクトを拡張したことでした。
setプロキシハンドラーのドキュメントによると、設定しようとしているオブジェクトにプロパティが存在しない場合は、プロトタイプのsetハンドラーが呼び出されます。
それで;
物体
プロトタイプ
a <-これを設定する(実際にはプロトタイプには存在しません)
__proto __(プロキシ)
set:(){}<-実際にはこれを呼び出します
また、setハンドラーが呼び出されると、レシーバー引数が設定しようとした元のオブジェクトに設定されます。 私の解決策はこれでした:
--- a/node_modules/vm2/lib/contextify.js
+++ b/node_modules/vm2/lib/contextify.js
@@ -17,7 +17,23 @@ const DEBUG = false;
const OPNA = 'Operation not allowed on contextified object.';
const ERROR_CST = Error.captureStackTrace;
const FROZEN_TRAPS = {
- set: (target, key) => false,
+ set: (target, key, value, receiver) => {
+ if( target !== receiver ){
+
+ Object.defineProperty(receiver, key, {
+ value: value,
+ writable: true,
+ enumerable: true,
+ configurable: true
+ })
+
+ return true;
+
+ }
+
+ return false;
+
+ },
ステータスはどうですか? プロジェクトは死んだ?
この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。
最も参考になるコメント
また、別の解決策も見つけました(パラダイムにより適していると思います)。
基本的に私が見つけたのは、コンテキスト化されたコードが、そのコンテキストで作成したオブジェクトのプロトタイプに書き込もうとしていたが、別のコンテキストから持ち込まれたオブジェクトを拡張したことでした。
setプロキシハンドラーのドキュメントによると、設定しようとしているオブジェクトにプロパティが存在しない場合は、プロトタイプのsetハンドラーが呼び出されます。
それで;
物体
プロトタイプ
a <-これを設定する(実際にはプロトタイプには存在しません)
__proto __(プロキシ)
set:(){}<-実際にはこれを呼び出します
また、setハンドラーが呼び出されると、レシーバー引数が設定しようとした元のオブジェクトに設定されます。 私の解決策はこれでした: