【问题标题】:ExpressJs sends stack in production modeExpressJs 在生产模式下发送堆栈
【发布时间】:2021-08-05 15:27:37
【问题描述】:

我正在尝试在上线之前模拟生产,并且我有以下设置

package.json

"start": "cross-env NODE_ENV=production node dist/index.js",

index.ts

console.log(process.env.NODE_ENV) // prints "production"
router.use(handleError);

error-handler.ts

import { serializeError } from 'serialize-error';

export function handleError(
  err: ResponseError,
  _req: Request,
  resp: Response,
  _next: NextFunction
): void {
  if (err) {
    resp.status(err.statusCode || 500).json(serializeError(err));
  }
}

使用此设置,当有错误请求时,我会在响应中获得堆栈,这是我不想要的。

如果我添加到错误处理函数

  if (err) {
     if (process.env.NODE_ENV === 'production') { 
          delete err.stack;
          resp.status(err.statusCode || 500).json(serializeError(err));
     }
  }

然后我没有得到堆栈。但是 Express 不应该在生产中自动删除堆栈吗?

【问题讨论】:

  • Express 在这里没有机会,因为您自己序列化错误对象并发送它。所以,你已经从 Express 手中接过了这份工作。堆栈仍将位于错误对象本身中。这来自错误的根源。
  • @jfriend00 好的,非常感谢您的评论。这是有道理的。我确实记得我对这个序列化程序有一些用处。除了这个堆栈之外,Express 默认功能中是否有任何我的 serializeError 阻止我从中受益的东西?我在想,如果它只是为了堆栈,那么我可以使用我在 OP 中提出的解决方法。

标签: node.js typescript express environment-variables


【解决方案1】:

Express 在这里没有机会,因为您自己序列化错误对象并发送它。所以,你已经从 Express 手中接过了这份工作。堆栈仍将位于错误对象本身中。这来自错误的来源。

如果您想在非生产模式下发送错误堆栈,我建议您修改您的提案,如下所示:

if (err) {
     if (process.env.NODE_ENV === 'production') { 
          delete err.stack;
     }
     resp.status(err.statusCode || 500).json(serializeError(err));
}

不过,我从不将堆栈跟踪作为响应的一部分发送。相反,我总是在本地记录错误:

if (err) {
     console.log(err);
     delete err.stack;
     resp.status(err.statusCode || 500).json(serializeError(err));
}

除了这个堆栈之外,Express 默认功能中是否有任何东西使我的 serializeError 无法从中受益?

Express doc page on error handling 值得一读。如果标头已经发送(例如您在流式传输响应时遇到错误),它们的默认处理程序会尝试不同的行为,因为此时您的选项受到更多限制。

他们还将任何不是 4xx 或 5xx 的 err.statusCode 强制为 500,因为他们希望确保它被报告为错误状态代码。您允许错误对象上的任何内容通过。

【讨论】:

    猜你喜欢
    • 2017-05-15
    • 2020-08-29
    • 2013-03-09
    • 1970-01-01
    • 2013-12-14
    • 2020-10-17
    • 1970-01-01
    • 2014-06-23
    • 2010-12-05
    相关资源
    最近更新 更多