NodeJS, Axios - отправить файл с локального сервера на другой сервер - PullRequest
0 голосов
/ 29 октября 2018

У меня есть конечная точка API, которая позволяет клиенту отправлять свои csv на наш сервер, а затем отправлять их на другой сервер. Я сделал нашу серверную часть, которая сохранила загруженный файл на наш сервер, но я не могу выполнить другую часть. Я получаю сообщение об ошибке { message: 'File not found', code: 400 }, которое может означать, что файл никогда не достигнет сервера Я использую Axios в качестве агента, кто-нибудь знает, как это сделать? Благодаря.

// file = uploaded file
const form_data = new FormData();
form_data.append("file", fs.createReadStream(file.path));
const request_config = {
    method: "post",
    url: url,
    headers: {
        "Authorization": "Bearer " + access_token,
        "Content-Type": "multipart/form-data"
    },
    data: form_data
};
return axios(request_config);

Обновление

Как указано в Axios Doc, как показано ниже, и API, который я пытаюсь вызвать, требует файл

// data - данные для отправки в качестве тела запроса. // Применяется только для методов запроса «PUT», «POST» и «PATCH» // Когда не установлен transformRequest, должен быть один из следующих типов: // - строка, простой объект, ArrayBuffer, ArrayBufferView, URLSearchParams // - Только браузер: FormData, File, Blob // - Только узел: Stream, Buffer

Есть ли способ заставить axios отправлять файл целиком? Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Это то, что вам действительно нужно:

const form_data = new FormData();
form_data.append("file", fs.createReadStream(file.path));

const request_config = {
  headers: {
    "Authorization": "Bearer " + access_token,
    "Content-Type": "multipart/form-data"
  },
  data: form_data
};

return axios
  .post(url, form_data, request_config);
0 голосов
/ 29 октября 2018

Я думаю, что createReadStream - ваша проблема, потому что она асинхронная. попробуй это. Поскольку createReadStream расширяет источник событий, мы можем «слушать», когда он заканчивается / заканчивается.

var newFile = fs.createReadStream(file.path);

// personally I'd function out the inner body here and just call 
// to the function and pass in the newFile
newFile.on('end', function() {
  const form_data = new FormData();
  form_data.append("file", newFile);
  const request_config = {
    method: "post",
    url: url,
    headers: {
        "Authorization": "Bearer " + access_token,
        "Content-Type": "multipart/form-data"
    },
    data: form_data
  };
  return axios(request_config);
});
...