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

5
我有两个使用http通信的node.js/express服务器。其中服务器A还与浏览器通信并能够处理文件上传请求。当文件上传到服务器A时,我希望将其原样传输到服务器B以进行进一步处理。最好使用request-promise模块来完成此操作,这也是我用于两个服务器之间通信的工具。

目前为止我做了这些,但是我无法在服务器之间传输文件。文件已成功上传到服务器A,并且在发送到服务器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;

Server 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.fileundefined

'use strict';

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

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

};

试试这个, https://dev59.com/En3aa4cB1Zd3GeqPcmQd - kasey
1
@kasey 这个问题涉及到两个服务器之间通过http进行通信,而不是通过WebSockets进行通信。 - zero298
你找到了理想的解决方案吗?我也在尝试同样的事情,但是发送文件时遇到了麻烦。使用 form-datarequest - Brandon Clark
2个回答

1

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,其中包含您在请求中传递的整个主体,并且现在应该有一个包含您的multer文件对象的req.file

0

您发送文件时使用的编码可能不是 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"
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接