Hai,
Saya mencoba mencari tahu mengapa modul bawaan diproksi dari Host dan tidak diperlukan di vm.
ini adalah pengaturan saya saat ini:
const vm = new NodeVM({
require: {
external: true,
context: 'sandbox',
builtin: ['*'],
},
});
vm.run(...);
di dalam VM saya memerlukan modul eksternal ( axios
jika itu penting) dan dalam rantai dependensi itu memerlukan modul lain ( follow-redirects
) yang melakukan ini (kurang lebih):
var Writable = require('stream').Writable;
function RedirectableRequest(options, responseCallback) {
// .....
}
RedirectableRequest.prototype = Object.create(Writable.prototype);
RedirectableRequest.prototype._performRequest = function () { // <-------- this line breaks
// ..........
}
menjalankan kode ini di dalam vm throws: TypeError: 'set' pada proxy: trap return falsish untuk properti '_performRequest'.
Objek aliran sedang diproksikan ke vm.
menjalankan kode ini ketika stream
sebenarnya diperlukan di dalam vm (dengan menghapus pernyataan if di sini: https://github.com/patriksimek/vm2/blob/master/lib/sandbox.js#L133) adalah bekerja.
menjalankan node 6.10.3 di osx.
Terima kasih
terkait dengan #127
Saya melanjutkan dan mengubah pernyataan if menjadi:
if( vm.options.require.context === 'sandbox' && modulename !== 'async_hooks' ){
Saya menemukan bahwa di node 8.x saya mengalami masalah dengan async_hooks
Saya juga menemukan solusi alternatif (yang menurut saya lebih cocok dengan paradigma).
Pada dasarnya apa yang saya temukan adalah kode kontekstual mencoba menulis ke prototipe objek yang dibuatnya dalam konteksnya, tetapi memperluas objek yang dibawa dari konteks lain.
Per dokumentasi pada set proxy handler, jika properti tidak ada pada objek yang Anda coba setel, prototipe set handler akan dipanggil.
Jadi;
Obyek
prototipe
a <-Mengatur ini (yang sebenarnya tidak ada pada prototipe)
__proto__ (proksi)
set: (){} <- Sebenarnya memanggil ini
Dan ketika pengendali set dipanggil, argumen penerima akan disetel ke objek asli yang kita coba atur. Solusi saya adalah ini:
--- 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;
+
+ },
Apa statusnya? Proyek mati?
Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.
Komentar yang paling membantu
Saya juga menemukan solusi alternatif (yang menurut saya lebih cocok dengan paradigma).
Pada dasarnya apa yang saya temukan adalah kode kontekstual mencoba menulis ke prototipe objek yang dibuatnya dalam konteksnya, tetapi memperluas objek yang dibawa dari konteks lain.
Per dokumentasi pada set proxy handler, jika properti tidak ada pada objek yang Anda coba setel, prototipe set handler akan dipanggil.
Jadi;
Obyek
prototipe
a <-Mengatur ini (yang sebenarnya tidak ada pada prototipe)
__proto__ (proksi)
set: (){} <- Sebenarnya memanggil ini
Dan ketika pengendali set dipanggil, argumen penerima akan disetel ke objek asli yang kita coba atur. Solusi saya adalah ini: