在什么情况下,res.status() 或 res.json() 会抛出/引发错误

Under what conditions might res.status() or res.json() throw/raise an error

提问人:Alexander Mills 提问时间:10/30/2023 最后编辑:Alexander Mills 更新时间:10/30/2023 访问量:38

问:

我有一个库的通用函数:

const sendResponse = (res: Response, errorTrace: InspectedError) => {

  if (res.headersSent) {
    log.warning('Headers already sent for response. Error:', errorTrace);
  }

  try {
    res.status(500);  // this one
  } catch (err) {
    log.error(err);
  }

  try {
    res.json({      // this one
      foo: 'bar'
    });

  } catch (err) {
    log.error(err);
  }

};

我很好奇 res.status() 和 res.json() 可能会引发哪些类型的错误 - 查看源代码是最好的选择还是有更好的方法来找出答案?

JavaScript node.js HTTP HttpResponse

评论

0赞 Evert 10/30/2023
以防万一这不是一个假设,这是你遇到的真实代码,这似乎不是好代码,它们感觉像是不需要的 catch 语句。最好在您的应用程序中将这些非常特殊的情况放在更高的位置,而不是针对每个情况。
0赞 Evert 10/30/2023
即使是图书馆,通常也应该抛出意想不到的情况。图书馆通常没有责任去发现和掩盖重大问题,除非这是图书馆的特定目的。鉴于你甚至想不出为什么这些案例会抛出,我怀疑你的情况是否如此。但当然可能是错误的,因为我不完全了解您的用例。只是有点危险(我希望这有帮助)

答:

1赞 jfriend00 10/30/2023 #1

我能想到的一些情况:

  1. res无效,并且不是对象或没有 OR 方法。statusjson
  2. res.json()如果给它一个无效的参数,或者你给它一个包含循环引用(不能用 JSON 表示)的对象,则可能会失败。

评论

0赞 Alexander Mills 10/30/2023
状态码可以多次设置吗?先后?
0赞 Alexander Mills 10/30/2023
你的最后一个陈述是非常错误的 - 我想尝试设置状态码,这可能会失败,但我仍然想尝试用 .json() 发送响应
1赞 jfriend00 10/30/2023
@AlexanderMills - 是的,它可以。它所做的只是设置一个属性,以记住发送最终响应时的状态。您可以多次调用它,最后一个获胜。
1赞 jfriend00 10/30/2023
@AlexanderMills - 好吧,我没有意识到你正在尝试同时执行 AND .我会用一次尝试/捕捉来写它。如果失败,您会遇到更大的问题,因为显然无效,因此我认为没有必要将其分开。res.status(500)res.json(...)res.status(500).json(...)res.status(500)restry/catch
2赞 jfriend00 10/30/2023
@AlexanderMills - 您知道您可以进入调试器并观察它的作用。这比阅读任何文档或在这里获得答案更具教育意义。这是真正知道它可能做什么的方法。而且,我发现这比尝试在 github 上查找相关的 nodejs/Express 源代码更容易。res.status(500)