【问题标题】:Creating JS library Warning instead of Error创建 JS 库警告而不是错误
【发布时间】: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


    【解决方案1】:

    查看console.trace 的源代码,您可以尝试使用 chrome 和 node.js:

    function warning(message) {
      var err = new Error;
      err.name = 'Warning';
      err.message = message; //or use util.format in nodejs
      Error.captureStackTrace(err, warning); // this is to prevent `warning` function being included in the stack.
      return err;
    };
    console.log(warning('message').stack);
    

    在 nodejs 中,这个输出:

    Warning: message
        at Object.<anonymous> (/home/ubuntu/workspace/warning.js:9:13)
        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
    

    不幸的是,firefox 没有captureStackTrace 方法。所以你必须直接调用上面的而不是把它包装在一个函数中。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2021-10-18
      • 2023-03-14
      • 2011-07-22
      相关资源
      最近更新 更多