通过服务发送收到的文件,而不保存它并用快递js和busboy管道

时间:2017-09-27 15:09:46

标签: node.js express request busboy

我有一个服务,接收带有文件和json数据的发布请求。我在app.js中使用body-parser包。我想将文件发送到" filer"服务,并从中处理答案,但我不想管道请求,因为我也需要处理json内容并在文件管理器应答后进行一些操作。

const Busboy = require('busboy');
const request = require('request');

const sendFile = (req, file, callback) => {
  return request.post({
    uri: 'http://localhost:5000/stream',
    headers: req.headers,
    formData: { value: file }
  }, (err, resp, body) => {
    if (err) return callback(err);
    return callback();
  });
};

app.post('/route', (req, res, next) {
  const busboy = new Busboy({ headers: req.headers });

  busboy.on('file', (fieldName, file) => {
    file.on('error', err => reject(err));
    return sendFile(req, file, (err, link) => {
      file.resume();
      if (err) return reject(err);
    });
  });

  busboy.on('field', (fieldName, val) => {
    // process the json here...
  });

  busboy.on('finish', () => {
    console.log('busboy.on(finish)');
    return next();
  });

  req.pipe(busboy);
}

文件管理器服务如下:

app.post('/stream', (req, res, next) => {
  const busboy = new Busboy({ headers: req.headers });
  // here we are ok
  busboy.on('file', function (fieldName, file, name) {
    // but this part never run
    res.send(200, { fileId: fileDoc._id });
  });

  return req.pipe(busboy);
});

不幸的是,文件管理器服务永远不会回答,我也不知道,缺少的部分在哪里。试图将file.resume()放在busboy.on('file')内的某些地方,但没有帮助。

1 个答案:

答案 0 :(得分:0)

这可能是因为来自busboy的文件流永远不会被请求formData正确处理。

另一种方式是:

  1. 暂时将流写入主服务中的本地文件。(使用fs.createWriteStream
  2. 从该文件创建一个流并将其传递给filer服务。(使用fs.createReadStream
  3. 在主要服务中执行您需要进行的任何处理。
  4. 等待来自filer服务的响应并致电next()
  5. 这样,如果需要或者将文件发送到其他服务,您甚至可以在主服务中使用该文件。