【问题标题】:Status code 300 return error in catch block when using axios使用 axios 时,catch 块中的状态码 300 返回错误
【发布时间】:2019-07-04 22:27:19
【问题描述】:

当我使用 axios 进行 http 调用时,它进入 catch 块并出现错误 我的要求是在 then 块中处理它不应该捕获的 300 响应,我如何通过 axios 实现这一点

【问题讨论】:

  • 请通过300 error 告诉我们你做了什么。
  • 如果需要全局处理错误,使用axios拦截器medium.com/@danielalvidrez/…
  • @MebinJoe 我认为使用拦截器对我没有帮助,因为我希望它停止进入状态代码 300 的 catch 块,而不是转换请求或响应对象

标签: javascript http axios


【解决方案1】:

我认为您有多种选择。您可以将代码从 then 回调中提取到函数中 - 并在状态代码为 300 时在错误处理程序中调用它。

您也可以从 axios 尝试此选项,仅当状态码 > 301 时才拒绝承诺。

axios.get('/user/12345', {
  validateStatus: function (status) {
    return status <= 300; // Reject only if the status code is greater than 300
  }
})

【讨论】:

  • 我在文档中看到了这一点,但我只希望状态码 300 用于其他状态码,我希望它是默认的
  • 当然,您可以将代码 300 列入“白名单”。尝试条件 - 状态
  • 对不起,我没明白白名单是什么意思,如果你能详细说明步骤会很有帮助
【解决方案2】:

我需要一些更有活力的东西:

// oversimplified index.js

const axios = require('axios')

const allowedStatusList = json.parse(process.env.ALLOWED_STATUSES) || ["2xx"]
// ^^ check that it's a valid input yourself :p 

const validateRequestStatusCode = allowedStatuses => {
  const stringStatuses = allowedStatuses.map(String)
  return status => {
    if (stringStatuses.includes(String(status))) {
      return true
    } else {
      for (let wildCardStatus of stringStatuses) {
        const validRange = wildCardStatus.match(/.+?(?=xx)/g)
        if (validRange && String(status).substring(0, 1) == validRange[0]) {
          return true
        }
      }
    }
    return false
  }
}

const axiosConfig = {
  validateStatus: validateRequestStatusCode(allowedStatusList),
  url,
  data
  // etc
}

axios(axiosConfig)
.then(...)
.catch(...)

这将允许您只提供一个环境变量(或者您想要进行配置)来更改哪些状态是有效的。

例如,设置 ALLOWED_STATUSES='["2xx", "3xx", "4xx"]' 将允许 200 和 499 中的任何状态代码。 设置ALLOWED_STATUSES='[200, 201, "3xx"]',您将拥有一个更具体的过滤器。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 2017-07-12
    • 2020-04-12
    • 2018-08-22
    • 2019-12-13
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多