节点js http服务器请求主体作为流可读

时间:2014-05-09 21:05:38

标签: node.js http stream request

我正在使用node.js编写一个http服务器,并且无法将请求主体隔离为流可读。以下是我的代码的基本示例:

var http = require('http')
  , fs = require('fs');

http.createServer(function(req, res) {
  if ( req.method.toLowerCase() == 'post') {
    req.pipe(fs.createWriteStream('out.txt'));
    req.on('end', function() {
      res.writeHead(200, {'content-type': 'text/plain'})
      res.write('Upload Complete!\n');
      res.end();
    });
  }
}).listen(8182);
console.log('listening on port 8182');

根据节点documentation,请求参数是http.IncomingObject的一个实例,它实现节点的可读流接口。像我上面一样使用stream.pipe()的问题是可读流包括请求标头的纯文本以及请求主体。有没有办法将请求主体隔离为可读流?

我知道存在文件上传的框架,例如强大的。我的最终目标不是创建上传服务器,而是充当代理并将请求主体流式传输到另一个Web服务。

提前感谢。

编辑>> 使用busboy的“Content-type:multipart / form-data”工作服务器

var http = require('http')
  , fs = require('fs')
  , Busboy = require('busboy');

http.createServer(function(req, res) {
  if ( req.method.toLowerCase() == 'post') {
    var busboy = new Busboy({headers: req.headers});
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      file.pipe(fs.createWriteStream('out.txt'));
    });
    req.pipe(busboy);
    req.on('end', function() {
      res.writeHead(200, 'Content-type: text/plain');
      res.write('Upload Complete!\n');
      res.end();
    });
  }
}).listen(8182);
console.log('listening on port 8182');

1 个答案:

答案 0 :(得分:1)

检查req.headers['content-type']。如果它是multipart/form-data,那么您可以使用像busboy这样的模块来解析请求,并为文件部分提供可读的流(如果存在,则为非文件部分提供纯字符串)。

如果内容类型是其他multipart/*类型,那么您可以使用dicer,这是busboy用于解析多部分的基础模块。