如何执行用户JS代码并获取错误的行号

时间:2018-07-19 17:46:40

标签: javascript line-numbers

我正在尝试执行用户编写的JavaScript,并获取用户代码中任何潜在错误的行号。我已经看过有关SO的现有帖子。

当前,我正在执行以下操作:

const userProg = document.createElement('script')
userProg.type = 'text/javascript'
userProg.id = 'user-program'
userProg.text = userCode //string containing user's code 
document.head.appendChild(userProg)

并且为了捕获用户代码中的错误,我执行以下操作:

window.onerror = function (msg, url, lineNo, colNo, error) {
    //User code will have anonymous in the stack 
    if(error.stack.includes("anonymous")) {
        console.log("user code has error at line: " + lineNo)
    }
    return false
}

这很好用- if 如果变量userCode有点像“ test = hello”一样乱七八糟。例如,window.onerror将记录:

enter image description here

这种方法的问题在于,如果用户代码确实存在严重错误(例如不成对的引号),则appendChild(或eval())会中断并抛出Uncaught SyntaxError

这是一个示例,其中userCode只是hello"-注意行号不是在<anonymous>而是在appendChild的{​​{1}}行,因此阻止了我从获取用户代码有错误的行中删除。还要注意我的generateScript函数如何不记录错误的行号。

enter image description here

我是否有办法在用户代码中获取错误的行号,即使该错误的语法错误非常严重(例如引号不匹配)也是如此。

我注意到的一个潜在的线索是,在第二个示例中,控制台输出“ VM63:3”,而3是用户代码的正确行号。 (单击“ VM63:3”会将我带到用户代码中)也许可以通过控制台执行操作来获取正确的行号?

更新1-好像这个项目:https://github.com/jlongster/unwinder符合我的要求。只是不确定它是如何工作的。

0 个答案:

没有答案