是否可以强制节点VM上下文停止运行?

时间:2016-12-23 04:00:01

标签: javascript node.js

Node有一个VM module,可以在新的上下文中运行任意JavaScript代码。

我想做的是找到一种方法来阻止此代码在回调函数上执行,以可靠的方式上下文无法停止。

这是一个棘手的样本,我一直试图找到解决方案。

<script>
    $(document).ready(function () {
        if (window.File && window.FileList && window.FileReader) {
            $("#files").on("change", function (e) {
                var files = e.target.files,
                    filesLength = files.length;
                var count = 0;

                for (var n = 0; n < filesLength; n = n + 3)
                //          Insert a row for 3 image cols
                    $("<div class=\"row\" id=\"addColHere0\"></div>").insertAfter("#whatup");

                for (var i = 0; i < filesLength; i++) {


                    var f = files[i]
                    var fileReader = new FileReader();
                    fileReader.onload = (function (e) {
                        var file = e.target;

                        // get the last DIV which ID starts with ^= "klon"
                        var $div = $('div[id^="addColHere"]:last');

                        // Read the Number from that DIV's ID (i.e: 3 from "klon3")
                        // And increment that number by 1
                        var num = parseInt($div.prop("id").match(/\d+/g), 10) + 1;
                        var changedId = "#addColHere" + (num - 1);
                        // Clone it and assign the new ID (i.e: from num 4 to ID "klon4")
                        var $klon = $div.clone().prop('id', 'klon' + num);

                        // >>> Append $klon wherever you want

                        //          Insert cols inside row 
                        $(changedId.value).append("<div id=\"breakThis\" class=\" col-sm-4 col-xs-6 toBeRemove\" style=\"padding:0 0px;\">" +
                            "<div class=\"col-sm-12  camera-style-small\"   align=\"left\" >" +
                            "<img style=\"    width:100%; height:100%; z-index:102;\" class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" +
                            "<span class=\"remove icon-delete_icon create-deleteStyle\"></span>" +
                            "</div>" +
                            "</div>");
                        i = i + 1;



                        $(".remove").click(function () {
                            //            $(this).parent(".camera-style-small").remove();
                            $(this).closest(".toBeRemove").remove();
                        });
                    });
                    fileReader.readAsDataURL(f);

                }
            });

        } else {
            alert("Sorry, but your browser doesn't support this function. Please update or try another browser.")
        }
    });
</script>

因为try / catch语句捕获了任何异常,所以只抛出异常。如果没有从回调中停止脚本,代码就会进入一个永久运行的虚拟循环(好吧,直到它达到设置的任何超时,直到那时浪费CPU周期)。

'use strict'; var vm = require('vm'); var src = '(' + (function(kill) { try { kill(); } catch (ex) {} // Can this be prevented? while (true) { // Nothing. } }) + ')'; var script = new vm.Script(src); var func = script.runInNewContext(); func(function() { console.log('This should somehow stop that VM from running.'); }); VM功能不是我想要的,因为我想停止脚本命令。我可以将此代码移动到另一个进程中运行并终止该进程,但这会增加很多开销。

我愿意接受这方面的创造性解决方案。也许使用Node's Debug objects的东西?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是在子进程中执行代码,如果需要,可以在那里尽早终止子进程。如果存在无限循环的可能性,你可能想要这样做,以避免使主脚本的事件循环挨饿。