Заметил это при попытке потребовать зависимость в 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)
Сообщите мне, есть ли еще какая-нибудь информация, которую я могу вам помочь!
У меня также довольно много проблем с прокси, особенно с наследованием. Я не уверен, связаны ли эти проблемы с реализацией или ограничениями прокси-серверов, но это стоит некоторого исследования.
Тоже столкнулся с этой ошибкой. Я недостаточно знаком с прокси, чтобы понять, почему текущий шаблон не подходит, но я смог устранить ошибку, добавив дополнительную проверку для свойств, не настраиваемых только для чтения, в 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];
}
Похоже, это соответствует описанию get
инварианта MDN :
Значение, сообщаемое для свойства, должно быть таким же, как значение соответствующего свойства целевого объекта, если свойство целевого объекта не является доступным для записи и не настраиваемым свойством данных.
Но мне кажется, что это сломает песочницу
Просто хочу отметить, что мы столкнулись с этой проблемой и локально, и приведенное выше изменение кода позволяет нам обойти проблему. Также отмечу, что это произошло при использовании модуля узла Google Sheets в почти точной копии их руководства по быстрому запуску (https://developers.google.com/sheets/api/quickstart/nodejs).
Есть ли обновления по этой проблеме?
Влияет ли это исправление на известную проблему « Невозможно определить класс, расширяющий прокси-класс ?» Что вы имеете в виду, это нарушит песочницу?
Эй, есть ли прогресс по этому вопросу?
Я пытался использовать библиотеки типа graceful-fs
и получил ту же ошибку.
Я столкнулся с этой ошибкой, когда экспортировал ES6 _class_ в скрипте, который использовался для запуска. это было нормально после того, как я перевел это на
ES5.
К сожалению, решение, опубликованное @mjbvz, ломает песочницу. Я не думаю, что есть способ исправить эту проблему - если прокси для объекта только для чтения не может возвращать ничего, кроме исходного значения, тогда мы облажались, и выброс ошибки - единственный способ сохранить безопасность песочницы .
Идеи очень приветствуются.
Можем ли мы получить клон в этой ситуации?
Клонирование не помогает - клон также является отдельной ценностью.
Я имел в виду клон fs.constants
, поэтому он больше не доступен только для чтения.
Это позволит песочнице вносить изменения в объект, которые могут вызвать проблемы в области действия хоста. Вы должны быть очень осторожны с тем, что вы отправляете в песочницу, потому что каждое изменение объекта, сделанное песочницей, также эффективно в контексте хоста.
Если он доступен только для чтения, нужен ли вам прокси-сервер для проверки данных?
Есть ли обновления по этой проблеме?
У меня такая же проблема при использовании модуля узла googleapi ...
Исправлено с https://github.com/patriksimek/vm2/pull/252.
@XmiliaH Спасибо! действительно ценю это. Работает с последней версией.
Самый полезный комментарий
Я столкнулся с этой ошибкой, когда экспортировал ES6 _class_ в скрипте, который использовался для запуска. это было нормально после того, как я перевел это на
ES5.