Код вроде этого:
const { VM } = require('vm2')
const vm = new VM()
const res = vm.run('[1, 2, 3]')
console.log(res)
Печать:
[ 1, 2, 3, '0': 1, '1': 2, '2': 3 ]
Это ошибка или ожидаемое поведение?
Сборка NodeJS в виртуальной машине возвращает:
[1, 2, 3]
как и ожидалось.
Привет @patriksimek , цитирую вас как главного сопровождающего. У меня тоже есть эта проблема. Это происходит с виртуальной машиной и с NodeVM.
В моем случае внутри NodeVM у меня есть фрагмент, который, помимо прочего, делает следующее:
const array = [];
array.push({a: 1, b: 2});
console.log(array);
И печатает:
[{a: 1, b: 2}, '0': {a: 1, b: 2}]
Консоль в настройке NodeVM установлена на inherit
.
Есть ли у вас какие-нибудь представления о том, что может вызвать такое поведение?
Заранее спасибо и извините за беспокойство.
Этот объект оказался прокси. Я считаю, что где-то в Decontextify.instance возвращается неправильный объект.
Производит ожидаемый результат в узлах v8.9.3 и node v8.10.0.
Проблема подтверждается на узле v10.14.2.
Попался в эту же проблему. Было неприятно отслеживать эту ошибку, думая, что она была в моем собственном коде. В конце концов решил попробовать очень простой пример, и вот, виноват vm2
. Похоже, что цикл for of
также делает некоторые странные вещи с массивами.
Производит ожидаемый результат в узлах v8.9.3 и node v8.10.0.
Проблема подтверждается на узле v10.14.2.
Я могу предложить запустить отладчик в версиях 8.10.0 и 10.14.2 и найти строку кода, вывод которой отличается.
Это было вызвано использованием ловушки Proxy.handler.ownKeys (). Это была проблема в узле и, похоже, исправлена в версии 12.
Планируете ли вы возврат к более старым версиям узла?
Проблема только в узле 10. Мы могли бы исправить, но это потребовало бы каждый раз проверять вызывающий объект функции и чтобы получить вызывающего, нам нужно было бы сгенерировать трассировку стека. Я считаю, что этого делать не стоит.
Проблема только в узле 10. Мы могли бы исправить, но это потребовало бы каждый раз проверять вызывающий объект функции и чтобы получить вызывающего, нам нужно было бы сгенерировать трассировку стека. Я считаю, что этого делать не стоит.
А как насчет проверки параметров конфигурации или интерфейса командной строки? Код для этого может быть довольно минимальным.
Я добавляю console
к vm._context
vm._context.console = console
vm.run("console.log([1,2,3])")
работает правильно!
Самый полезный комментарий
Привет @patriksimek , цитирую вас как главного сопровождающего. У меня тоже есть эта проблема. Это происходит с виртуальной машиной и с NodeVM.
В моем случае внутри NodeVM у меня есть фрагмент, который, помимо прочего, делает следующее:
И печатает:
Консоль в настройке NodeVM установлена на
inherit
.Есть ли у вас какие-нибудь представления о том, что может вызвать такое поведение?
Заранее спасибо и извините за беспокойство.