像这样的代码:
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]
如预期的那样。
嗨@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])")
它工作正常!
最有用的评论
嗨@patriksimek ,我引用您为主要维护者。 我也有这个问题。 VM和NodeVM会发生这种情况。
就我而言,在NodeVM内,我有一个片段(除其他事项外)执行此操作:
并打印:
NodeVM设置中的控制台设置为
inherit
。您是否知道可能会导致这种行为的任何线索?
在此先感谢您,不便之处,敬请原谅。