2016-02-24 1 views
3

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

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

Маршруты Сервер A:

'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; 

Сервер uploadController:

'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 ProcessFile:

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

'use strict'; 

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

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

}; 
+0

Попробуйте это, http://stackoverflow.com/questions/22279922/file-data-transfer-between-two-node-js-servers – kasey

+1

@kasey Это касается связи через ** WebSockets **. Этот вопрос связан с двумя серверами, обменивающимися через ** http **. – zero298

+0

Вы нашли идеальное решение? Я пытаюсь сделать то же самое, но проблема с отправкой файла. Использование [form-data] (https: // github.com/form-data/form-data) с [request] (https://github.com/request/request) –

ответ

0

кодирования, что вы используете так отправить файл не может быть multipart/form-data. Попробуйте настроить этот заголовок в запросе отправки файла. Экспресс req.files будет заполнен только multipart/form-dataExpress req.files will only be populated with a multipart/form-data. Вы уже используете multer, поэтому я предполагаю, что отправляющая кодировка не совсем правильная.

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

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 теперь, содержит файл multer объект.

 Смежные вопросы

  • Нет связанных вопросов^_^