2016-02-24 52 views
3

我有两个使用http互相通信的node.js/express服务器。 服务器A也与浏览器通信,并可以处理文件上传请求。当文件上传到服务器A我想将它原样传输到服务器B进一步处理。最好的办法是什么?最好与request-promise模块,这是我用于两台服务器之间的通信。在两个node.js服务器之间通过http传输文件

这是我走到这一步,但我无法在服务器之间传输文件,该文件被成功上传到服务器A,并没有错误,同时将其发送到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; 

服务器A 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.fileundefined

'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。你已经在使用甩干器,所以我猜猜发送的编码不是很正确。

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你应该可以看到一个包含你的整个身体在你的请求中传递,你应该有一个字段body一个req.body一个req.file现在包含您multer文件目的。

相关问题