【问题标题】:transfer files between two node.js servers over http通过 http 在两个 node.js 服务器之间传输文件
【发布时间】:2016-06-07 08:39:40
【问题描述】:

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

这是我目前得到的,但是我无法在服务器之间传输文件,文件成功上传到服务器A,发送到@987654325时没有错误@,但服务器 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 上传控制器:

'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 进程文件:

这里我想处理来自 Server A 的文件,但 req.fileundefined

'use strict';

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

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

};

【问题讨论】:

  • @kasey 处理通过 WebSockets 的通信。这个问题涉及通过 http 进行通信的两台服务器。
  • 您找到理想的解决方案了吗?我正在尝试同样的事情,但无法发送文件。将form-datarequest 一起使用

标签: javascript node.js express multer


【解决方案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 内,您应该会看到一个 req.body 带有一个字段 body,其中包含您在请求中传递的整个正文,并且您现在应该有一个包含您的 multer 文件对象的 req.file

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2017-08-29
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多