序列化不是 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
]
})