Vm2: 执行数组将返回奇怪的对象。 [Node.js 10.xx]

创建于 2019-04-07  ·  10评论  ·  资料来源: patriksimek/vm2

像这样的代码:

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的内置VM返回:
[1, 2, 3]
如预期的那样。

bug confirmed help wanted wontfix

最有用的评论

@patriksimek ,我引用您为主要维护者。 我也有这个问题。 VM和NodeVM会发生这种情况。

就我而言,在NodeVM内,我有一个片段(除其他事项外)执行此操作:

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

并打印:

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

NodeVM设置中的控制台设置为inherit

您是否知道可能会导致这种行为的任何线索?

在此先感谢您,不便之处,敬请原谅。

所有10条评论

@patriksimek ,我引用您为主要维护者。 我也有这个问题。 VM和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和节点v8.10.0下产生预期的输出。
在节点v10.14.2下确认了该问题

遇到同样的问题。 沮丧地跟踪此错误,以为它是在我自己的代码中。 最终决定尝试一个非常小的示例,瞧瞧, vm2是元凶。 似乎for of循环也对数组做了一些奇怪的事情。

在节点v8.9.3和节点v8.10.0下产生预期的输出。
在节点v10.14.2下确认了该问题

我可以建议的是在v.8.10.0和v10.14.2中运行调试器,并找到一行输出不同的代码。

这是由使用Proxy.handler.ownKeys()陷阱引起的。 这是节点中的问题,似乎已在v12中修复。

您是否计划对旧版本的节点进行任何回退?

问题仅在节点10上。我们可以进行修复,但这将需要每次检查函数的调用者并获取调用者,我们需要生成堆栈跟踪。 我认为这样做是不值得的。

问题仅在节点10上。我们可以进行修复,但这将需要每次检查函数的调用者并获取调用者,我们需要生成堆栈跟踪。 我认为这样做是不值得的。

那如何检查配置或CLI参数呢? 相应的代码可能很少。

我将console加到vm._context
vm._context.console = console
vm.run("console.log([1,2,3])")
它工作正常!

此页面是否有帮助?
0 / 5 - 0 等级