javascript - 在 React 中,node.js .getHeaders() 相当于什么? (与axios react 的文件上传)

标签 javascript reactjs axios http-headers

我尝试向 api 发出补丁请求,以便上传一个文件,我可以使用 Postman 使其工作,但不能在我使用 axios 的 React 项目中工作。 (响应状态为 200,但我尝试上传的文件未上传)。

所以我检查了 postman 为该请求生成的代码(它是为node.js生成的),与我所做的似乎不同的是在 header 中除了

'Content-Type': 'application/json', 
'Authorization': 'Bearer randomstring.randomstring.randomstring',

他还使用 FormData 中的 header 。那么react中formData.getHeaders()的等价物是什么?

var axios = require('axios');
var FormData = require('form-data');
var fs = require('fs');
var data = new FormData();
data.append('userImageFile', fs.createReadStream('/C:/Users/George/Downloads/dummy.jpg'));

var config = {
  method: 'patch',
  url: 'https://api.services.thenameoftheapi.net/api/v3/billing/cebfecea-ff40-4e1f-9fb0-ca588496c787/',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer randomstring.randomstring.randomstring', 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

PS:.getHeaders() 从表单数据中提取哪些 header 如果表单数据只包含我上传的文件?

var userImageFile;

function onFileFormSubmit(e) {
  e.preventDefault();
  const formData = new FormData();
  formData.append("userimage", userImageFile);
  // var headers = formData.getHeaders() // what would headers contain?
  props.patchUser(formData); //redux saga flow
}

function onFileChange(e) {
  userImageFile= e.target.files[0]
  e.target.nextSibling.click(); // To submit the form
}

// an in return of react component the form is the following
<form onSubmit={onFileFormSubmit}>
   <label htmlFor={"upload" + i} className="table_upload">Upload</label>
   <input className="d-none" id={"upload" + i} onChange={onFileChange} type="file"></input>
   <button className="d-none" type="submit"></button>
</form>

发出实际补丁请求的代码如下

import axios from "axios"

const axiosApi = axios.create({
    baseURL: 'https://api.services.thenameoftheapi.net/api/v3',
    'Authorization': 'Bearer '
})

axiosApi.interceptors.request.use(function (config) {

    let access_token = localStorage.getItem("accessToken");
    config.headers = {
      ...config.headers,
      'Authorization': 'Bearer ' + access_token
    }
    config = {...config, Authorization: 'Bearer ' + access_token}
    return config;
  });


export async function patch(url, data, config = {}) {
    console.log('url = ', url); // This outputs correct url
    console.log('data = ', data); // This outputs FormData {}
    console.log('config = ', config); // Empty now but exists to pass parameters if needed
    var headers = {};
    for (var pair of data.entries()) {
        console.log(pair[0]+ ', ' + pair[1]);     // This outputs userimage, [object File]
    }
  
    if ('headers' in config && config.headers ) {
      headers = config.headers
      delete config.headers;
    }
    return axiosApi
      .patch(url, { ...data }, { params: { ...config }, headers: headers })
      .then( response => response.data)
  }

最佳答案

你对标题做了奇怪的事情。这是一个稍微简化的版本,理论上应该按原样工作:

import axios from "axios";

const axiosApi = axios.create({
  baseURL: 'https://api.services.thenameoftheapi.net/api/v3'
});

axiosApi.interceptors.request.use(function (config) {
  config.headers = {
    ...config.headers,
    'Authorization': 'Bearer ' + localStorage.getItem("accessToken")
  };
  return config;
});

// I renamed "config" to "params", to avoid confusion
export function patch(url, data, params = {}) {
  let headers = {};

  if (params.headers) {
    headers = params.headers
    delete params.headers;
  }

  // Here, don't do { ...data }, you are destroying the FormData instance!
  return axiosApi
    .patch(url, data, { params, headers })
    .then(({ data }) => data)
}

这将导致请求具有此 header :

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxXxXxXx

关于javascript - 在 React 中,node.js .getHeaders() 相当于什么? (与axios react 的文件上传),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67724446/

相关文章:

javascript - 使用 JavaScript 更改 div 顺序

javascript - 突出显示 FlatList 中的搜索文本 - React Native

javascript - MemoryRouter 没有设置位置的搜索部分

JavaScript Map.get(variableName) 返回未定义

javascript - 为什么我们要向 javascripts 原型(prototype)添加函数?

javascript - 在较大的数据网格上 KO 性能较差

javascript - AXIOS之后更新静态吗? VUEJS

javascript - 使用 Axios (React) 从 API 获取数据时出现“Access-Control-Allow-Origin”错误

javascript - 为什么我的 create-react-app 没有在移动浏览器上显示?

javascript - 在触发下一行之前,使用 axios 进行 react 等待数据获取不起作用