Akan lebih baik jika vm2 bisa menampilkan jejak tumpukan "benar" saat kesalahan dilemparkan dari kotak pasir.
Misalnya, inilah yang sedang ditampilkan:
/home/user/box-js/node_modules/vm2/lib/main.js:213
throw this._internal.Decontextify.value(e);
^
Error: foobar
at Object.log (/home/user/box-js/analyze.js:248:10)
at Object.apply (/home/user/box-js/node_modules/vm2/lib/contextify.js:288:34)
at vm.js:491:9
at ContextifyScript.Script.runInContext (vm.js:53:29)
at VM.run (/home/user/box-js/node_modules/vm2/lib/main.js:207:72)
at Object.<anonymous> (/home/user/box-js/analyze.js:383:5)
at Module._compile (module.js:569:30)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:503:32)
at tryModuleLoad (module.js:466:12)
Apakah ada cara untuk mengetahui baris mana (dalam kode kotak pasir) yang bertanggung jawab untuk memanggil fungsi yang memunculkan kesalahan?
Ini akan luar biasa. Saya mencoba melacak kesalahan pengkodean sekarang dan mengalami kesulitan yang sangat berat tanpa nomor baris
Jika Anda menjalankan kasus pengujian yang Anda yakini aman, Anda dapat mengganti vm2 untuk sementara dengan vm asli untuk melacak error tersebut.
Saya juga suka fitur ini. Senang bisa ikut menulisnya jika seseorang mengarahkan saya ke arah yang benar.
Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.
Ternyata tidak sepele mengganti vm2 dengan Native vm karena ada api yang tidak kompatibel, semoga ini bisa tetap terbuka!
@patriksimek , saya merancang implementasi sederhana berdasarkan pengecualian parser / rewriter. Saya pikir akan sangat bermanfaat untuk mengintegrasikannya ke dalam vm2 sebagai penangan kesalahan opsional.
const StackTracey = require ('stacktracey');
const { VM } = require('vm2');
const sourceCode = `function f() {
throw Exception('e');
}
f();`;
const scriptName = "hello_world.js";
process.on("uncaughtException", e => {
if (!e.stack.includes("/node_modules/vm2/")) {
// This is not a vm2 error, so print it normally
console.log(e);
return;
}
const oldStack = new StackTracey(e);
const newStack = [];
for (const line of oldStack) {
// Discard internal code
if (line.file.includes("/cjs"))
continue;
if (line.thirdParty && line.file.includes("/node_modules/vm2/"))
continue;
if (line.callee == "Script.runInContext")
continue;
// Replace the default filename with the user-provided one
if (line.fileName == "vm.js")
line.fileRelative = line.fileShort = line.fileName = scriptName;
newStack.push(line);
}
console.log("[vm2] A clean stack trace follows:");
console.log(new StackTracey(newStack).pretty);
});
const vm = new VM();
vm.run(sourceCode, scriptName);
Kode di atas akan mencetak:
ReferenceError: Exception is not defined
at f (vm.js:2:2)
at vm.js:4:1
at Script.runInContext (vm.js:135:20)
at VM.run (/tmp/vm2-test/node_modules/vm2/lib/main.js:210:72)
at Object.<anonymous> (/tmp/vm2-test/index.js:33:4)
at Module._compile (internal/modules/cjs/loader.js:805:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:816:10)
at Module.load (internal/modules/cjs/loader.js:672:32)
at tryModuleLoad (internal/modules/cjs/loader.js:612:12)
at Function.Module._load (internal/modules/cjs/loader.js:604:3)
[vm2] A clean stack trace follows:
at f hello_world.js:2
at hello_world.js:4
at <anonymous> index.js:33 vm.run(sourceCode, scriptName);
Saya belum memiliki kesempatan untuk menguji pustaka ini tetapi saya baru-baru ini menggunakan modul vm dan mencapai nomor pelacakan tumpukan yang akurat dengan mengatur offset baris yang sesuai saat membuat vm.Script baru.
Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.
Kupikir saya akan berkomentar karena masalah + saran ini masih relevan untuk saya!
Sangat relevan bagi saya juga.
@patriksimek dapatkah implementasi
Terima kasih.
Patrik, apakah sketsa implementasinya terlihat oke secara keseluruhan? Jika demikian saya dapat membuat PR dan kami dapat bekerja dari sana.
@CapacitorSet Ya, dengan senang hati saya akan mengulas PR. Beberapa catatan:
vm.run
tidak menerima parameter kedua - itulah sebabnya nama skrip diabaikan. Saat ini, Anda perlu membuat VMScript dengan nama yang ditentukan terlebih dahulu. Tapi itu bisa diperbaiki dengan mudah.Hanya meninggalkan komentar untuk memberi tahu orang-orang yang berlangganan masalah ini - Saya membuka PR, sehingga Anda dapat melacak kemajuannya di sana.
Komentar yang paling membantu
Hanya meninggalkan komentar untuk memberi tahu orang-orang yang berlangganan masalah ini - Saya membuka PR, sehingga Anda dapat melacak kemajuannya di sana.