通过http在两个node.js服务器之间传输文件

时间:2016-02-24 20:40:16

标签: javascript node.js express multer

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

这是我到目前为止所得到的,但我无法在服务器之间传输文件,文件已成功上传到服务器A ,并且在将文件发送到{{{}时没有错误1}},但服务器B不会将请求识别为文件。我在这里失踪了什么?

服务器A路由:

server B

服务器A uploadController:

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

服务器B路由:

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

此处我想处理来自服务器A 的文件,但'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; req.file

undefined

2 个答案:

答案 0 :(得分:0)

您正在使用的编码发送文件可能不是multipart/form-data。尝试在文件发送请求中设置该标头。快递req.files只会使用multipart/form-data Express 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"
    }
});

答案 1 :(得分: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文件对象。