axios transformRequest - 如何更改 JSON 有效负载

jam*_*mes 7 javascript axios

我在 Express API 中使用axios,我想在将其发送到另一个 API 之前转换有效负载。axios 正好有这个叫做transformRequest. 不过,这就是我遇到问题的地方。

我的代码看起来像:

const instance = axios.create({
  baseURL: 'api-url.com',
  transformRequest: [
    (data, headers) => {
      const encryptedString = encryptPayload(JSON.stringify(data));

      data = {
        SecretStuff: encryptedString,
      };

      return data;
    },
  ],  
});

// firing off my request using the instance above:
const postData = {
    id: 1,
    name: 'James',
};
instance.post('/getStuff', postData)
Run Code Online (Sandbox Code Playgroud)

最终,我想发布api-url.comJSON: {"SecretStuff": "some-base64-string"}- 不是postData上面显示的对象。

从文档中,它说:“数组中的最后一个函数必须返回一个字符串或一个 Buffer、ArrayBuffer、FormData 或 Stream 的实例”——但当然这里我要返回一个对象,数据。奇怪的是,在 axios 文档中,它显示它们data从返回transformRequest,但在它们的情况下,必须是正确的数据类型。

如何使用 axios实际转换有效负载?

Kev*_*vin 18

axios.create({
    transformRequest: [(data, headers) => {
        // modify data here
        return data;
    }, ...axios.defaults.transformRequest]
});
Run Code Online (Sandbox Code Playgroud)

必须将原件axios.defaults.transformRequest附加到transformRequest此处的选项中..


Var*_*der 7

您不想使用JSON.stringify()转换后的帖子数据吗?像下面这样:

const instance = axios.create({
    baseURL: 'api-url.com',
    transformRequest: [
        (data, headers) => {
            const encryptedString = encryptPayload(JSON.stringify(data));

            data = {
                SecretStuff: encryptedString,
            };

            return JSON.stringify(data);
        },
    ],  
});
Run Code Online (Sandbox Code Playgroud)

  • 跟进我的上述评论,将数据字符串化解决了这个问题。我还必须设置正确的标题 `headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json' }` 以使 POST 工作(传统上 Axios 已经为我完成了,但在这种情况下,因为它是一个自定义实例,我需要手动设置它们) . 谢谢您的帮助! (5认同)