在 Axios 中自定义日期序列化

2024-03-31

默认情况下,当 JavaScript 对象包含 Date 对象时,Axios 将其序列化为 UTC。这意味着传输的时间是使用时区进行转换的。这不适用于我的用例。我需要将没有时区转换的时间发送为 UTC。

我实现了一个基于的自定义序列化器#1548 https://github.com/axios/axios/issues/1548,但没有任何效果。我已经验证配置正在被修改,但是当我查看请求负载时,日期仍然使用 UTC (2022-02-03T04:59:00.000Z)。

注意:我的逻辑比较复杂,我在下面的代码中使用 toLocaleString() 来简化示例。

const a = axios.create()
a.interceptors.request.use((config) => {
  config.paramsSerializer = (params) =>
    qs.stringify(params, {
      serializeDate: (date: Date) => date.toLocaleString(),
    })
  return config
})

有人理解为什么我不能覆盖默认行为并使用我自己的日期格式吗?

环境 axios 版本 0.21.1


序列化不是 Axios 进行的。Date实施toJSON() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON当您的对象(包含日期)通过序列化时使用JSON.stringify() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description...

的实例Date实施toJSON()函数通过返回一个字符串(与date.toISOString())。因此,它们被视为字符串。

The paramSerializer用于序列化queryparams 这就是它不适用于您的请求正文的原因。

要转换请求正文,您需要使用transformRequest.

这是一个通用的递归转换器,可以查找日期并将其映射到本地化字符串

import axios, { AxiosRequestTransformer } from "axios"

const dateTransformer: AxiosRequestTransformer = data => {
  if (data instanceof Date) {
    // do your specific formatting here
    return data.toLocaleString()
  }
  if (Array.isArray(data)) {
    return data.map(val => dateTransformer(val))
  }
  if (typeof data === "object" && data !== null) {
    return Object.fromEntries(Object.entries(data).map(([ key, val ]) =>
      [ key, dateTransformer(val) ]))
  }
  return data
}

然后,您可以在 Axios 实例中注册此转换器,它将应用于所有 PUT、POST、PATCH 和 DELETE 请求。

const instance = axios.create({
  transformRequest: [ dateTransformer ].concat(axios.defaults.transformRequest)
})

instance.post(url, data)

如果通用版本看起来有点粗暴,您可以在发布之前自己转换对象......

const body = {
  date: new Date()
}

axios.post(url, {
  ...body,
  date: body.date.toLocaleString()
})

或注册一个内联变压器

axios.post(url, body, {
  transformRequest: [
    data => ({
      ...data,
      date: data.date.toLocaleString()
    }),
    ...axios.defaults.transformRequest
  ]
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Axios 中自定义日期序列化 的相关文章

随机推荐