Vm2: يؤدي تنفيذ مصفوفة إلى إرجاع كائن غريب. [Node.js 10.xx]

تم إنشاؤها على ٧ أبريل ٢٠١٩  ·  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 ، أقتبس منك

في حالتي ، داخل 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 ، أقتبس منك

في حالتي ، داخل 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

ما يمكنني اقتراحه هو تشغيل مصحح أخطاء في الإصدار 8.1.0 و v10.14.2 والعثور على سطر من التعليمات البرمجية حيث يكون الإخراج مختلفًا.

كان هذا بسبب استخدام اعتراض Proxy.handler.ownKeys (). كانت هذه مشكلة في العقدة ويبدو أنها تم إصلاحها في الإصدار 12.

هل تخطط لأي نظام احتياطي للإصدارات الأقدم من العقدة؟

المشكلة هي فقط في العقدة 10. يمكننا إجراء إصلاح ، ولكن هذا يتطلب التحقق من المتصل بوظيفة ما في كل مرة ولجعل المتصل نحتاج إلى إنشاء تتبع مكدس. أعتقد أنه لا يستحق القيام بذلك.

المشكلة هي فقط في العقدة 10. يمكننا إجراء إصلاح ، ولكن هذا يتطلب التحقق من المتصل بوظيفة ما في كل مرة ولجعل المتصل نحتاج إلى إنشاء تتبع مكدس. أعتقد أنه لا يستحق القيام بذلك.

ماذا عن فحص معلمة التكوين أو CLI بدلاً من ذلك؟ قد يكون رمز ذلك ضئيلًا جدًا.

أضفت console إلى vm._context
vm._context.console = console
vm.run("console.log([1,2,3])")
انها تعمل بشكل صحيح!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات