【发布时间】:2015-10-05 04:28:01
【问题描述】:
我正在使用 NPM 创建自己的 JS 库。我想给我图书馆的用户一个警告,而不是一个错误,然而,我希望我的用户有一个我在我的图书馆中登录的警告的堆栈跟踪。因此,为了获取堆栈跟踪,我使用 new Error().stack。这样做的问题是(1)“错误”一词默认出现在堆栈跟踪中,(2)堆栈跟踪对于 Node 和 Chrome 是相同的,但对于 Mozilla 是不同的。
所以我的问题是 - 创建具有堆栈跟踪但看起来不像错误的警告消息的最佳方法是什么? Chrome 和 Node.js 是对齐的,我可以在调用 toString() 之前简单地删除堆栈数组的第一个元素。但问题是这不适用于 Mozilla。
无论如何,当应该发出警告时,这就是我目前在我的库中所做的:
var err = new Error('looks like you have called IdempotentJSON.parse on an object that was already parsed');
console.error(err.message.concat('\n'),err.stack);
这个“记录警告”看起来像这样
在 Chrome 中
looks like you have called IdempotentJSON.parse on an object that was already parsed
Error: looks like you have called IdempotentJSON.parse on an object that was already parsed
at IdempotentJSON.parse (http://localhost:3000/static/vendor/idempotent-json.js:11:23)
at Backbone.Model.extend.persistModel.save.success (http://localhost:3000/static/app/js/models/userModel.js:88:56)
at Object._.extend.save.options.success (http://localhost:3000/static/vendor/backbone.js:620:30)
at jQuery.Callbacks.fire (http://localhost:3000/static/vendor/jquery.js:3099:30)
at Object.jQuery.Callbacks.self.fireWith [as resolveWith] (http://localhost:3000/static/vendor/jquery.js:3211:7)
at done (http://localhost:3000/static/vendor/jquery.js:8264:14)
at XMLHttpRequest.jQuery.ajaxTransport.send.callback (http://localhost:3000/static/vendor/jquery.js:8605:9)
在 Mozilla Firefox 中:
"looks like you have called IdempotentJSON.parse on an object that was already parsed
" "IdempotentJSON.prototype.parse@http://localhost:3000/static/vendor/idempotent-json.js:11:23
@http://localhost:3000/static/app/js/app.js:157:30
Backbone.batchSyncCollection/<@http://localhost:3000/static/app/js/app.js:141:16
jQuery.Callbacks/fire@http://localhost:3000/static/vendor/jquery.js:3099:10
jQuery.Callbacks/self.fireWith@http://localhost:3000/static/vendor/jquery.js:3211:7
done@http://localhost:3000/static/vendor/jquery.js:8264:5
.send/callback/<@http://localhost:3000/static/vendor/jquery.js:8605:1
在 Node.js 中
looks like you have called IdempotentJSON.parse on an object that was already parsed
Error: looks like you have called IdempotentJSON.parse on an object that was already parsed
at IdempotentJSON.parse (/Users/amills001c/WebstormProjects/first_comcast/node_modules/idempotent-json/index.js:9:19)
at Object.<anonymous> (/Users/amills001c/WebstormProjects/first_comcast/IJSONexp/ijson.js:8:15)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
at startup (node.js:129:16)
at node.js:814:3
一个适用于 Node.js 和 Chrome 的快速解决方案是删除堆栈跟踪中显示“错误:...”的第一行。
但是这个调用无效:
err.stack.shift(); //error
显然堆栈不是JS中的数组?
这对 Mozilla 无论如何都不起作用。
我最好的选择是另一个库来检查它所在的环境/浏览器吗?像这样:
http://www.eriwen.com/javascript/js-stack-trace/
现在是 2015 年!顺便说一句,Mozilla、Chrome 和 Node 的堆栈跟踪是正确的,我可以单击 Chrome 和 Node 中的堆栈跟踪,它会将我带到所涉及的文件,我似乎无法在 Firefox 中执行此操作。
我想要的是这样的东西:
Warning: looks like you have called IdempotentJSON.parse on an object that was already parsed
at IdempotentJSON.parse (http://localhost:3000/static/vendor/idempotent-json.js:11:23)
at Backbone.Model.extend.persistModel.save.success (http://localhost:3000/static/app/js/models/userModel.js:88:56)
at Object._.extend.save.options.success (http://localhost:3000/static/vendor/backbone.js:620:30)
at jQuery.Callbacks.fire (http://localhost:3000/static/vendor/jquery.js:3099:30)
at Object.jQuery.Callbacks.self.fireWith [as resolveWith] (http://localhost:3000/static/vendor/jquery.js:3211:7)
at done (http://localhost:3000/static/vendor/jquery.js:8264:14)
at XMLHttpRequest.jQuery.ajaxTransport.send.callback (http://localhost:3000/static/vendor/jquery.js:8605:9)
【问题讨论】:
标签: javascript node.js google-chrome firefox mozilla