Vm2: Executar um array retorna um objeto estranho. [Node.js 10.xx]

Criado em 7 abr. 2019  ·  10Comentários  ·  Fonte: patriksimek/vm2

Código como este:

const { VM } = require('vm2')
const vm = new VM()
const res = vm.run('[1, 2, 3]')
console.log(res)

Impressões:
[ 1, 2, 3, '0': 1, '1': 2, '2': 3 ]
Isso é um bug ou um comportamento esperado?

A compilação do NodeJS na VM retorna:
[1, 2, 3]
como esperado.

bug confirmed help wanted wontfix

Comentários muito úteis

Olá @patriksimek , cito você como mantenedor principal. Eu também tenho esse problema. Isso acontece com VM e com NodeVM.

No meu caso, dentro do NodeVM eu tenho um snippet que -entre outras coisas- faz isso:

const array = [];
array.push({a: 1, b: 2});
console.log(array);

E estampas:

[{a: 1, b: 2}, '0': {a: 1, b: 2}]

O console na configuração do NodeVM está definido como inherit .

Você tem alguma ideia do que pode gerar esse comportamento?

Obrigado antecipadamente e desculpe incomodar.

Todos 10 comentários

Olá @patriksimek , cito você como mantenedor principal. Eu também tenho esse problema. Isso acontece com VM e com NodeVM.

No meu caso, dentro do NodeVM eu tenho um snippet que -entre outras coisas- faz isso:

const array = [];
array.push({a: 1, b: 2});
console.log(array);

E estampas:

[{a: 1, b: 2}, '0': {a: 1, b: 2}]

O console na configuração do NodeVM está definido como inherit .

Você tem alguma ideia do que pode gerar esse comportamento?

Obrigado antecipadamente e desculpe incomodar.

Este objeto acabou por ser um Proxy. Acredito que em algum lugar em Decontextify.instance um objeto errado seja retornado.

Produz a saída esperada no nó v8.9.3 e no nó v8.10.0.
O problema foi confirmado no nó v10.14.2

Encontrei este mesmo problema. Frustrante rastrear esse bug, pensando que estava no meu próprio código. Por fim, decidi tentar um exemplo mínimo e, vejam só, vm2 era o culpado. Parece que o loop for of também faz algumas coisas estranhas com matrizes.

Produz a saída esperada no nó v8.9.3 e no nó v8.10.0.
O problema foi confirmado no nó v10.14.2

O que posso propor é executar um depurador em v.8.10.0 e v10.14.2 e encontrar uma linha de código onde a saída é diferente.

Isso foi causado pelo uso de uma armadilha Proxy.handler.ownKeys (). Este era um problema no nó e parece ter sido corrigido na v12.

Você planeja algum fallback para versões mais antigas do nó?

O problema está apenas no nó 10. Poderíamos fazer uma correção, mas isso exigiria verificar o chamador de uma função todas as vezes e para obter o chamador, precisaríamos gerar um rastreamento de pilha. Acho que não vale a pena fazer isso.

O problema está apenas no nó 10. Poderíamos fazer uma correção, mas isso exigiria verificar o chamador de uma função todas as vezes e para obter o chamador, precisaríamos gerar um rastreamento de pilha. Acho que não vale a pena fazer isso.

Que tal uma verificação de configuração ou parâmetro CLI em vez disso? O código para isso pode ser mínimo.

Eu adiciono console a vm._context
vm._context.console = console
vm.run("console.log([1,2,3])")
está funcionando corretamente!

Esta página foi útil?
0 / 5 - 0 avaliações