关于代码错误的准确位置的问题
Closed this issue · 10 comments
老赵,您好:
我有一个比较复杂的应用正在nodeJs上使用Jscex开发,跟数据库和缓存NOSQL数据库的交互比较多。当代码出现异常时,根据错误的信息得不到出错的行号,而是指向异步函数的开始位置,我想这应该是在编译时eval报的错,如果要得到准确的行号和module文件名,有什么招数么?
谢了!
如下:文件findCust.js代码有个位置的函数isNull未定义,而这个文件又引用几个别的库,类似出现的异常找起来很不方便:
执行出错:ReferenceError: isNull is not defined
Trace:
at [object Object]. (eval at (/usr/local/future/ctrl/findCust.js:69:28))
at /usr/local/future/node_modules/jscex-async/jscex-builderbase.js:231:64
at Object. (/usr/local/future/node_modules/jscex-async/jscex-async.js:201:33)
at Object._notify (/usr/local/future/node_modules/jscex-async/jscex-async.js:139:34)
at Object.complete (/usr/local/future/node_modules/jscex-async/jscex-async.js:126:22)
at /usr/local/future/node_modules/jscex-async/jscex-async.js:187:31
at /usr/local/future/node_modules/jscex-async/jscex-builderbase.js:162:29
at /usr/local/future/node_modules/jscex-async/jscex-builderbase.js:242:41
at Object. (/usr/local/future/node_modules/jscex-async/jscex-async.js:201:33)
at Object._notify (/usr/local/future/node_modules/jscex-async/jscex-async.js:139:34)
这不是eval时出的错,而是执行时的问题。因为JavaScript不支持source map,因此以JavaScript作为目标语言的这种机制都有类似问题。
我的建议是,使用jscexc来AOT编译再部署到服务器上,这样部署以后收到的错误就是实际在那个js文件中的错误了。目前jscexc的文档还没写,我这两天就写下。现在你可以先安装jscexc:
npm install jscexc
然后调用它:
node node_modules/jscexc --input <input_file> --output <output_file>
谢老赵。我安装了jscexc,编译时报以下错误是怎么回事?
Node版本是0.6.15,操作系统是 CentOS6.2 32位,同样在Win7 64位也报同样的错。
[root@localhost future]# node node_modules/jscexc --input ctrl/findCust.js --output ctrl/findCust.jscex.js
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
SyntaxError: Illegal token
at Object.newSyntaxError (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:1107:21)
at Object.get (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:1089:28)
at Object.peek (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:778:27)
at Object.done (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:751:25)
at Statements (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:1435:22)
at Script (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:1290:23)
at Object.parse (/usr/local/future/node_modules/jscexc/lib/narcissus-parser.js:2839:17)
at /usr/local/future/node_modules/jscexc/src/jscexc.js:174:40
at Object.<anonymous> (/usr/local/future/node_modules/jscexc/src/jscexc.js:197:19)
at Module._compile (module.js:441:26)
刚试了一下,好象在JS文件中不支持
var a = module.exports.a = function() {
}
要写成:
var a= function() {
}
module.exports.a = a;
这样编译就通过了。
另外还不支持utf-8 带签名(DOM)的文件,这两个问题解决后,编译成功了。:)
我上次遇到这个问题是因为换行符是Windows的\r\n,所以jscexc使用的parser不支持(JIT没问题),你说的两个问题我也是刚知道,我验证一下。多谢反馈!
另外还有两个问题,看来是我不熟悉这个编译器的问题:)
1、一目的减号不支持:如
var errcode = -20111;//负数
会报:Error: "UNARY_MINUS" is not currently supported.
要写成:
var errcode = 0 - 20111;
2、代码非异步函数中抛出异常时:
throw '无此记录';
编译时会报:Error: "throw" is not currently supported.
异步函数中抛出没问题
呃,jscexc问题真多,它的parser用了个不同的,还没足够测试(Jscex单元测试正在进行中)。
我修复了这个问题,您用源代码覆盖一下吧。
好的,谢谢老赵为Jscex的辛勤工作!
代码中导出接口时
module.exports = a;
会报:SyntaxError: module statements only allowed in Harmony
要写成
exports = a;
应该不能这么改,效果是不一样的。
看来我应该好好折腾下narcissus parser了……还是替换下代码吧,这次是lib下的narcissus-parser.js文件。
Good job! thanks!