You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cookie Clicker游戏Mod如何获取用户提交JS代码的报错行列位置?

解决方案

方案1:使用sourceURL标记(最简实现,无额外依赖)

浏览器原生支持//# sourceURL指令,你可以给用户代码末尾追加该指令,让浏览器将这段用户代码识别为独立的虚拟文件,报错的行列信息会直接映射到用户代码本身,不会指向你Mod源码里new Function的位置。
修改后的校验代码如下:

try{
    // 先过滤用户代码中自带的sourceURL避免冲突
    const cleanedUserCode = code.value.replace(/^\/\/# sourceURL.*$/mg, '');
    // 追加sourceURL标记,指定虚拟文件名
    const markedUserCode = cleanedUserCode + '\n//# sourceURL=user-custom-code.js';
    let func = new Function(markedUserCode);
    func.call(null, [[0, 1, 2], Game]);
    save.classList.remove('ModBuildingSorter_unsaved');
}
catch(e){
    if (e instanceof SyntaxError) {
        // 错误的lineNumber、columnNumber属性直接对应用户代码的行列
        alert(`语法错误:${e.message}\n出错位置:第${e.lineNumber}行 第${e.columnNumber}列`);
    } else {
        // 运行时错误也可以通过e.stack提取对应行列信息
        alert(`运行错误:${e.message}`);
    }
    console.dir(e);
}

你给出的缺失闭合括号的示例用该方案测试,捕获到的错误行号会直接返回4,完全匹配实际出错位置。

方案2:静态语法校验(更安全,无需执行用户代码)

如果担心直接执行用户代码存在安全风险,可以将轻量JavaScript语法解析库打包进你的Mod中,在校验阶段直接解析用户代码的语法树,不需要执行代码就能提前捕获所有语法错误和对应的行列位置,同时还能自定义校验规则,限制用户代码的可用API范围,避免恶意代码执行。

内容的提问来源于stack exchange,提问作者Frustrated programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:30:04