如何通过编程方式找到javascript语法错误的位置?

时间:2012-08-20 11:13:01

标签: javascript node.js syntax-error

我正在使用require加载Node.js模块。这会抛出语法错误(错误对象)。

有没有办法让文件中的位置出现错误?

我可以看到堆栈(下方),但我没有任何位置信息。我知道我可以使用substack的node-syntax-error,但有没有办法从Javascript Error对象获取类似的位置信息?

SyntaxError: Unexpected identifier
at Module._compile (module.js:437:25)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
... // the rest is in my code

编辑:

根据Vadim在下面的评论,是的,我很想做。我看到该节点抛出了错误。拥有仅包含test.js的{​​{1}}文件会导致节点出错

abc

现在问题是,是否有一个节点API要做这个错误(节点module.js模块使用),这样我就不必ReferenceError: abc is not defined at Object.<anonymous> (test.js:1:63) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:901:3 了?

4 个答案:

答案 0 :(得分:3)

您可以使用包含SyntaxError的文件简单地运行node并查看控制台输出。

答案 1 :(得分:0)

Error.stack

错误具有存储堆栈跟踪的“堆栈”属性。

try {
    throw new Error("with some message");
}
catch(err) {
    // print error's stack trace to stder
    console.error(err.stack);
}

在名为“/home/myusername/test.js”的文件上运行

node /home/myusername/test.js

将输出以下内容

Error: with some message
    at Object.<anonymous> (/home/myusername/test.js:2:11)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

答案 2 :(得分:0)

@laconbass回答对我有用。

err.stack

我尝试了一个博客框架,我得到了:500内部服务器错误。希望我放一个控制台:

 app.use(function(error, req, res, next) {
    res.status(500).render('500');
      console.log(error);
  });

我可以看到不具有描述性的错误:

TypeError: Cannot read property 'replace' of undefined

经过几分钟的研究,我找到了答案,所以我尝试了:

 app.use(function(error, req, res, next) {
    res.status(500).render('500');
      console.log(error.stack);
  });

我可以看到源点错误:(Object.exports.replace)

TypeError: Cannot read property 'replace' of undefined
    at Object.exports.replace (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/filters.js:411:15)
    at eval (eval at <anonymous> (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:498:13), <anonymous>:41:63)
    at Object.exports.each (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/utils.js:45:11)
    at eval (eval at <anonymous> (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:498:13), <anonymous>:26:10)
    at Object.eval [as tpl] (eval at <anonymous> (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:498:13), <anonymous>:85:3)
    at compiled (/.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:619:18)
    at /.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:559:20
    at /.../some_folder/node.js-blog-engine/node_modules/swig/lib/swig.js:690:9
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)

我知道这不是语法错误,但可以找到javascript / node错误的位置。

我是nodejs的新手。

我希望这会有所帮助。

答案 3 :(得分:0)

您可以使用stacktracey库。它打印好的callstacks和源代码行,还解析SyntaxError输出(在高于v4的Node中)。

例如,在尝试要求此文件(名为test_files/syntax_error.js)时:

// next line contains a syntax error (not a valid JavaScript)
foo->bar ()

...抛出的错误的漂亮打印调用堆栈将是:

at (syntax error)                  test_files/syntax_error.js:2  foo->bar ()
at it                              test.js:184                   try { require ('./test_files/syntax_error.js') }
at runCallback                     timers.js:781
at tryOnImmediate                  timers.js:743
at processImmediate [as _immediat  timers.js:714

...通过解析Node中util.inspect调用的原始输出生成第一行。

该库还提供对已解析调用堆栈内容的完整API访问,因此您可以将输出调整为您想要的任何内容。希望这会有所帮助。