【问题标题】:Getting the stack trace in a custom error handler in Express?在 Express 的自定义错误处理程序中获取堆栈跟踪?
【发布时间】:2013-03-08 15:55:25
【问题描述】:

我在 Express 中使用自定义错误页面,如 here 所述。

但是当我这样做时,我只看到错误消息。我想获取与默认 Express 错误处理程序(堆栈跟踪等)中显示的相同信息,以便我可以:

  1. 将其记录到控制台(如果我可以为此保留默认设置,我会很高兴)。
  2. 在错误页面上显示,但仅限本地主机。

我该怎么做?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    只需使用提供给中间件的错误

      // Handle 500
      app.use(function(error, req, res, next) {
         console.error(error);
         if (ISLOCALHOST()) {
           res.json(error, 500);
         } else {
           res.send('500: Internal Server Error', 500);
         }
      });
    

    【讨论】:

    • 不显示堆栈跟踪,只显示顶级错误消息。
    • 尝试将其包装在 new Error() 中您可能会将字符串传递给 next() 您应该像 next(new Error("this thing failed"); 那样做
    • 我没有“扔”任何东西——如果我将一个动作指向错误的视图(例如),我通常会得到完整的堆栈跟踪。有了这个,只是顶级消息。
    • 堆栈跟踪不是来自抛出,而是来自new Error() try (function bob () { console.log(new Error('test').stack); })()
    • 但我没有调用 new Error()。
    【解决方案2】:

    这是@generalhenry 回答的修改版本。您可以访问堆栈跟踪 在err.stack 中,这样你就可以将它传递到你的“500”视图上,并在它上面做一些花哨的 css 样式。

    app.use(function(err, req, res, next) {
       if (err instanceof NotFound) {
           res.render('errors/404');
       } else {
           res.render('errors/500', {error: err, stack: err.stack});
       }
    });
    
    function NotFound() {
       this.name = "NotFound";
       Error.call(this, msg);
       Error.captureStackTrace(this, arguments.callee);
    }
    
    // below all route handlers
    // If all fails, hit em with the 404
    app.all('*', function(req, res){
       throw new NotFound;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 2019-03-05
      • 2014-08-20
      相关资源
      最近更新 更多