如何避免从 ExpressJS 抛出 400 错误

Posted

技术标签:

【中文标题】如何避免从 ExpressJS 抛出 400 错误【英文标题】:How to Avoid throwing 400 errors from ExpressJS 【发布时间】:2019-09-14 05:53:41 【问题描述】:

背景:我的网站上的一个格式错误的 cookie(来自我的一个附属页面)收到 400 个错误(以及一个空白的 400 页响应)。我已经编写了删除 cookie 的代码,但我的一些客户仍然收到错误,因为它在他们的缓存中。一旦他们清除缓存,问题就解决了。

这个问题在我的 .NET 代码库中通过简单地忽略 400 错误而被完全规避,我想在 Express JS 中做同样的事情。

问:我想在出现 400 错误(通常由有缺陷的 cookie 引起)时明确忽略所有 cookie,或者至少一起忽略该错误。有没有办法做到这一点?

我的 ClearDefectiveCookies 函数供参考(正常运行)

const clearDefectiveCookies = (req, res, next) => 
  const cookies = req.cookies;
  const defectiveCookies = Object.keys(cookies).filter(key => typeof cookies[key] === 'string' && (cookies[key].charAt(0) === '='));

  if (defectiveCookies.length > 0) 
    defectiveCookies.forEach(defectiveCookie => 
      res.clearCookie(defectiveCookie);
    );
  

  next();
;

有问题的 Cookie 供参考

名称:xyz_123 和值:=NaN=xyz=123

【问题讨论】:

【参考方案1】:

可能问题出在您调用res.clearCookie 的方式上。如果你查看documentation,它会说:

Web 浏览器和其他合规客户端仅在给定选项与res.cookie() 相同的选项(不包括 expires 和 maxAge)时才会清除 cookie。

因此,为了清除 cookie,您必须提供第二个参数作为对象,提供路径。

【讨论】:

嘿 Shimon,谢谢回复。它确实可以正常工作并且正确地摆脱了 cookie。但似乎中间件可能会在抛出 400 错误之前完成它。不知道如何让它一起忽略 400 错误,因为我的代码成功删除了损坏的 cookie【参考方案2】:

所以答案实际上是节点在 2018 年 11 月发生了重大变化,问题不是 cookie,而是节点的最大 cookie 大小导致 400 错误。它实际上不是快递..

在此处查看答案:Why am I getting 400 errors? Node, Express, ReactJS

【讨论】:

以上是关于如何避免从 ExpressJS 抛出 400 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 ExpressJS 响应中返回异步等待 try/catch 抛出错误 [重复]

从不同的工作表调用子时抛出 400

Razor:asp-page-handler 不会触发处理程序并抛出 400 错误

FireBase 在第一轮循环后抛出 WebException 400

sequelize抛出错误方言需要在express js中显式定义

节点:断言:400 抛出错误; ^ AssertionError [ERR_ASSERTION]:指定的回调对象无效