Как переслать POST-запрос multipart / form-data в Node другому сервису - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно отправить POST multipart / form-data (файл xliff) с клиента на мой сервер Node.js, а затем перехватить данные в Node.js и переслать этот POST в другую службу Java.

Я использовал multer и express-fileupload для анализа потока данных формы и захвата буфера xliff в Node.js, и оба дали мне файл с содержимым в качестве буфера.

Однако я не могу заново создать объект FormData в слое Node для пересылки POST в службу Java.

Я продолжаю получать сообщение об ошибке «Соединение прервано при анализе многокомпонентных данных» или просто не получен ответ от службы Java.

Я также пытался использовать библиотеку tmp для локального создания временного файла, чтобы записать буфер, а затем попытаться FormData('file', fs.createReadStream(<path>)), но мне это тоже не сработало ... хотя я ' я не уверен, что я делал это правильно.

Использование точно такого же запроса doPOST непосредственно из браузера работает нормально, но как только я пытаюсь перехватить вызов в слое Node и затем перенаправить POST в службу Java, он больше не работает для меня.

.

const multer = require('multer');
const upload = multer();

router.post('/', upload.any(), (req, res) => {
  const { headers, files } = req;

  console.log('--------------- files:', files[0]); // object with buffer, etc.

  const XMLString = files[0].buffer.toString('utf8'); // xml string of the xliff

  const formFile = new FormData();
  formFile.append('file', XMLString);

  console.log('--------------- formFile:', formFile); // FormData object with a key of _streams: [<xml string with boundaries>, [Function: bound ]]

  headers['Content-Type'] = 'multipart/form-data';
  const url = 'some/url/to/Java/service'

  doPOST(url, formFile, {}, headers)
    .catch((error) => {
      const { status, data } = error.response;
      res.status(status).send(data);
    })
    .then(({ data }) => {
      res.send(data);
    });
});

1 Ответ

0 голосов
/ 24 марта 2019

Вы можете напрямую передать buffer в данные своей формы, но затем вам также необходимо указать параметр filename.

const multer = require('multer');
const upload = multer();

router.post('/', upload.any(), (req, res) => {
  const { headers, files } = req;
  const { buffer, originalname: filename } = files[0];

  const formFile = new FormData();
  formFile.append('file', buffer, { filename });

  headers['Content-Type'] = 'multipart/form-data';
  const url = 'some/url/to/Java/service'

  doPOST(url, formFile, {}, headers)
    .catch((error) => {
      const { status, data } = error.response;
      res.status(status).send(data);
    })
    .then(({ data }) => {
      res.send(data);
    });
});
...