Node.js中的SyntaxError的行号

我有一些使用vm模块和runInNewContext函数的代码,并执行dynamic生成的JavaScript代码。 基本上是一个更安全的eval选项。

代码(可变code )可能包含语法错误,所以我想赶上它们并打印一些有用的信息。

 try { vm.runInNewContext(code, sandbox, filename); } catch (e) { if (e instanceof SyntaxError) { // always false console.log(e.toString()); // "SyntaxError: Unexpected token ||" for example console.log(e.line); // how to get the line number? } } 

我想打印语法错误的行号,但我有两个问题:

  • 我不知道如何识别exception是SyntaxError还是别的。 instaceof不起作用(更新 – 我可以使用e.name === "SyntaxError" )。
  • 即使我能够认出它,我怎么能得到行号呢? 可能吗?

提前致谢。

更新:我可以从e.stack得到一些信息 – 然而,堆栈跟踪中最顶层的调用是runInNewContext (使用它的行号),但是我仍然找不到code的行号,导致exception( SyntaxError ) 。

1)使用if (e.name === "SyntaxError")

2)与错误相关的所有数据保存在e.stack

使用try / catch

将堆栈存储在全局variables中

logging沙箱

 var util = require('util'); var vm = require('vm'); var sandbox = {e:null}; var src = 'try{count += 1;}catch(err) {e=err.stack}'; vm.runInNewContext(src , sandbox, 'myfile.vm'); console.log(util.inspect(sandbox)); 

这将logging:

{e:'ReferenceError:count没有定义\ n在myfile.vm:1:13 \ n …

现在你可以看到错误发生在myfile.vm的第13行,这仍然需要你在不同的地方放置一些try / cathc块,但是至less现在你可以得到反馈

编辑:

添加一个方法来检测运行代码中的语法错误

 var acorn = require('acorn'); var src = "try{\n"+ " {" + " count += 1;\n"+ " }catch(err) {\n" + " e=err.stack\n" + "}"; var result = acorn.parse(src); 

这样做会导致与“SyntaxError:意外的令牌(3:4)”,例如。 第3行,第4个字符是意想不到的标记,(额外{不应该在那里)

虽然stackedy ,但可以使用stackedy模块 ,它可以帮助您处理堆栈跟踪。 但这并不是完美的解决scheme,因为显示的行号是函数调用中的行号,而不是源文件中的行号。

特别看一下这个简单的例子 :

index.js

 var stackedy = require('stackedy'); var fs = require('fs'); var src = fs.readFileSync(__dirname + '/src.js'); var stack = stackedy(src, { filename : 'stax.js' }).run(); stack.on('error', function (err, c) { stack.stop(); console.log('Error: ' + err); var cur = c.current; console.log(' in ' + cur.filename + ' at line ' + cur.start.line); c.stack.forEach(function (s) { console.log(' in ' + s.filename + ', ' + s.functionName + '() at line ' + s.start.line ); }); }); 

src.js

 function f () { g() } function g () { h() } function h () { throw new SyntaxError('woops') } f(); 

输出:

 ~/tmp ❯❯❯ node index.js Error: SyntaxError: woops in stax.js at line 2 in stax.js, h() at line 1 in stax.js, g() at line 0 in stax.js, f() at line 4 

如注释中所述,您可以使用err.name === 'SyntaxError'来检查错误types。

对于* nix:

if (err) console.log(err.stack.split('\n')[1]);

它会logging堆栈跟踪的第二行,出现错误的地方。

Windows或Mac可能需要其他拆分符号(取决于系统行尾)

    Interesting Posts