Vm2: TypeError: 'get' on proxy:property'constants 'は、プロキシターゲットの読み取り専用で構成不可能なデータプロパティですが、プロキシが実際の値を返しませんでした

作成日 2017年03月07日  ·  15コメント  ·  ソース: patriksimek/vm2

VMで依存関係を要求しようとしたときに、これに気づきました。 再現するコード:

const { NodeVM } = require("vm2");

const vm = new NodeVM({
  console: "redirect",
  sandbox: {},
  require: {
    builtin: ["fs"]
  },
  wrapper: "none"
});

vm.run("const fs = require('fs'); fs.constants");

フルスタックトレース:

node_modules/vm2/lib/main.js:327
            throw this._internal.Decontextify.value(e);
            ^
TypeError: 'get' on proxy: property 'constants' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
    at Object.<anonymous> (vm.js:1:91)
    at NodeVM.run (node_modules/vm2/lib/main.js:325:27)
    at Object.<anonymous> (script.js:12:4)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)

他に役立つ情報があれば教えてください。

bug confirmed help wanted

最も参考になるコメント

実行に使用したスクリプトでES6_class_をエクスポートしたときに、このエラーが発生しました。 私がそれを翻訳した後、それは大丈夫でした
ES5。

全てのコメント15件

また、プロキシ、特に継承に関して、かなりの数の問題が発生しています。 これらの問題がプロキシの実装によるものなのか制限によるものなのかはわかりませんが、調査する価値があります。

また、このエラーが発生しました。 現在のパターンが正しくない理由を理解するのに十分なプロキシに精通していませんが、 Contextify.object.getに読み取り専用の構成不可能なプロパティのチェックを追加することで、エラーをなくすことができました。

    object: function(object, traps, deepTraps, flags, mock) {
        const proxy = new host.Proxy(object, host.Object.assign({
            get: (target, key, receiver) => {
                if (key === 'vmProxyTarget' && DEBUG) return object;
                if (key === 'isVMProxy') return true;
                if (mock && key in mock) return mock[key];
                if (key === 'constructor') return Object;
                if (key === '__proto__') return Object.prototype;

                                // Added code
                const config = host.Object.getOwnPropertyDescriptor(object, key);
                if (config && config.configurable === false && config.writable === false) {
                    return object[key];
                }

これは、 MDNが説明するgetに続くようです。

ターゲットオブジェクトプロパティが書き込み不可、構成不可のデータプロパティである場合、プロパティについて報告される値は、対応するターゲットオブジェクトプロパティの値と同じである必要があります。

しかし、それはサンドボックスを壊すように私には思えます

ローカルでもこの​​問題が発生していることに注意してください。上記のコード変更により、問題を回避できます。 また、クイックスタートガイド(https://developers.google.com/sheets/api/quickstart/nodejs)のほぼ正確なコピーでGoogleSheetsノードモジュールを使用しているときにこれが発生したことにも注意してください。

この問題に関する更新はありますか?

この修正は、既知の問題「プロキシされたクラスを拡張するクラスを定義することはできませんか?」に影響しますか? サンドボックスを壊すとはどういう意味ですか?

ねえ、この問題の進展はありますか?
graceful-fsようなライブラリを使おうとすると、同じエラーが発生します。

実行に使用したスクリプトでES6_class_をエクスポートしたときに、このエラーが発生しました。 私がそれを翻訳した後、それは大丈夫でした
ES5。

残念ながら、 @ mjbvzによって投稿されたソリューションはサンドボックスを壊します。 その問題を修正する方法はないと思います-読み取り専用オブジェクトのプロキシが元の値以外のものを返すことができない場合、私たちは失敗し、エラーをスローすることがサンドボックスを安全に保つ唯一の方法です。

アイデアは大歓迎です。

この状況でクローンを取得できますか?

クローンは役に立ちません-クローンもまた明確な価値です。

fs.constantsクローンを意味したので、読み取り専用ではなくなりました。

これにより、サンドボックスがオブジェクトに変更を加えることができ、ホストのスコープ内で問題が発生する可能性があります。 サンドボックスによって行われたオブジェクトへのすべての変更はホストのコンテキストでも有効であるため、サンドボックスに送信する内容には十分注意する必要があります。

読み取り専用の場合、検証のためにプロキシも必要ですか?

この問題に関する更新はありますか?
googleapiノードモジュールを使用すると同じ問題が発生します...

@XmiliaHありがとうございます! 心から感謝する。 最新バージョンで動作しています。

このページは役に立ちましたか?
0 / 5 - 0 評価