Code wie folgt:
const { VM } = require('vm2')
const vm = new VM()
const res = vm.run('[1, 2, 3]')
console.log(res)
Drucke:
[ 1, 2, 3, '0': 1, '1': 2, '2': 3 ]
Ist das ein Fehler oder ein erwartetes Verhalten?
Die in NodeJS integrierte VM gibt Folgendes zurück:
[1, 2, 3]
wie erwartet.
Hallo @patriksimek , ich zitiere Sie als Hauptbetreuer. Ich habe auch dieses Problem. Dies geschieht mit VM und mit NodeVM.
In meinem Fall habe ich in der NodeVM einen Ausschnitt, der - unter anderem - Folgendes tut:
const array = [];
array.push({a: 1, b: 2});
console.log(array);
Und druckt:
[{a: 1, b: 2}, '0': {a: 1, b: 2}]
Die Konsole im NodeVM-Setup ist auf inherit
.
Haben Sie eine Ahnung, was dieses Verhalten hervorrufen könnte?
Vielen Dank im Voraus und entschuldigen Sie die Mühe.
Dieses Objekt stellte sich als Proxy heraus. Ich glaube, dass irgendwo in Decontextify.instance ein falsches Objekt zurückgegeben wird.
Erzeugt die erwartete Ausgabe unter Knoten v8.9.3 und Knoten v8.10.0.
Das Problem wird unter Knoten 10.14.2 bestätigt
Bin auf dasselbe Problem gestoßen. Es ist frustrierend, diesen Fehler aufzuspüren und zu denken, dass er in meinem eigenen Code enthalten ist. Schließlich entschied man sich, ein sehr minimales Beispiel zu versuchen und siehe da, vm2
war der Schuldige. Es scheint, dass die for of
-Schleife auch einige seltsame Dinge mit Arrays macht.
Erzeugt die erwartete Ausgabe unter Knoten v8.9.3 und Knoten v8.10.0.
Das Problem wird unter Knoten 10.14.2 bestätigt
Was ich vorschlagen kann, ist, einen Debugger in Version 8.10.0 und Version 10.14.2 auszuführen und eine Codezeile zu finden, in der die Ausgabe unterschiedlich ist.
Dies wurde durch die Verwendung eines Proxy.handler.ownKeys () - Traps verursacht. Dies war ein Problem im Knoten und scheint in Version 12 behoben zu sein.
Planen Sie einen Fallback für ältere Versionen von Node?
Das Problem liegt nur auf Knoten 10. Wir könnten eine Korrektur durchführen, aber dazu müsste der Aufrufer einer Funktion jedes Mal überprüft werden, und um den Aufrufer zu erhalten, müssten wir einen Stack-Trace generieren. Ich denke, dass es sich nicht lohnt, dies zu tun.
Das Problem liegt nur auf Knoten 10. Wir könnten eine Korrektur durchführen, aber dazu müsste der Aufrufer einer Funktion jedes Mal überprüft werden, und um den Aufrufer zu erhalten, müssten wir einen Stack-Trace generieren. Ich denke, dass es sich nicht lohnt, dies zu tun.
Was ist stattdessen mit einer Konfigurations- oder CLI-Parameterprüfung? Der Code dafür könnte ziemlich minimal sein.
Ich füge console
zu vm._context
vm._context.console = console
vm.run("console.log([1,2,3])")
es funktioniert richtig!
Hilfreichster Kommentar
Hallo @patriksimek , ich zitiere Sie als Hauptbetreuer. Ich habe auch dieses Problem. Dies geschieht mit VM und mit NodeVM.
In meinem Fall habe ich in der NodeVM einen Ausschnitt, der - unter anderem - Folgendes tut:
Und druckt:
Die Konsole im NodeVM-Setup ist auf
inherit
.Haben Sie eine Ahnung, was dieses Verhalten hervorrufen könnte?
Vielen Dank im Voraus und entschuldigen Sie die Mühe.