передавать файлы между двумя серверами node.js через http

У меня есть два сервера node.js/express, которые общаются друг с другом через http. сервер А также взаимодействует с браузером и может обрабатывать запросы на загрузку файлов. Когда файл загружается на сервер A, я хочу передать его как есть на сервер B для дальнейшей обработки. как лучше всего это сделать? желательно с модулем request-promise, который я использую для связь между двумя серверами.

Это то, что я получил до сих пор, но я не могу передать файл между серверами, файл успешно загружен на сервер A, и при отправке его на server B нет ошибки, но сервер B is не распознает запрос как файл. что мне здесь не хватает?

Маршруты сервера А:

'use strict';

// Routes

 const express = require('express');
 const router = express.Router();
 const multer = require('multer');
 const upload = multer();

 const uploadController = require('./controllers/file/upload');

 router.post('/upload',upload.single('file'),uploadController); 

 module.exports = router;

Контроллер загрузки сервера A:

'use strict';

const RP = require('request-promise');

module.exports = (req, res) => {

  const body = req.body;

  if(req.file) {

    const file = req.file;

    RP('http://serverB.net/process', { 
      method: 'POST',
      formData: {file_buffer: file.buffer},
      body: body
    })
    .then((response) => {
      return res.status(200).send(response);
    })
    .catch((e) => {
      return res.status(500).send(e.message);
    })
  }
  else {
     return res.status(500).send('unable to upload file');
  }
};

Маршруты сервера B:

'use strict';

// Routes

 const express = require('express');
 const router = express.Router();
 const multer = require('multer');
 const process = multer();

 const processFile = require('./controllers/file/processFile');

 router.post('/process', process.single('file'), processFile); 

 module.exports = router;

Файл процесса сервера B:

здесь я хочу обработать файл с сервера A, но req.file это undefined

'use strict';

module.exports = (req, res) => {

  if(req.file) {
  // here i want to do something with the file.
  }

};

person baba-dev    schedule 24.02.2016    source источник
comment
Попробуйте это, stackoverflow .com/questions/22279922/   -  person kasey    schedule 24.02.2016
comment
@kasey Это касается связи через WebSockets. Этот вопрос касается двух серверов, обменивающихся данными через http.   -  person zero298    schedule 24.02.2016
comment
Нашли идеальное решение? Я пытаюсь сделать то же самое, но у меня проблемы с отправкой файла. Использование form-data с запрос   -  person Brandon Clark    schedule 10.02.2017


Ответы (2)


router.post('/process', process.single('file'), processFile);

Эта строка, а именно process.single('file'), указывает multer искать поле file, которое будет содержать фактические данные файла. Однако в своем запросе вы никогда не указываете значение для file. Измените имя file_buffer на просто file в своем запросе. Или измените свой process.single() на process.single('file_buffer')

RP('http://serverB.net/process', { 
  method: 'POST',
  formData: {
    file: file.buffer,
    body: body
  }
})
.then((response) => {
  return res.status(200).send(response);
})
.catch((e) => {
  return res.status(500).send(e.message);
})

Теперь на сервере B внутри processFile вы должны увидеть req.body с полем body, которое содержит все ваше тело, переданное в вашем запросе, и у вас должно быть req.file now, содержащее ваш файловый объект multer.

person peteb    schedule 24.02.2016

Кодировка, которую вы используете для отправки файла, может отличаться от multipart/form-data. Попробуйте установить этот заголовок в запросе на отправку файла. Express req.files будет заполнен только multipart/form-data Express req.files будет заполнен только multipart/form-data. Вы уже используете multer, поэтому я предполагаю, что кодировка отправки не совсем правильная.

RP({
    method: "POST",
    uri: "serverB.net",
    form: {
        file: file.buffer
    },
    headers: {
        "Content-Type": "multipart/form-data"
    }
});
person zero298    schedule 24.02.2016