我正在使用 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');
根据节点的文档 http://nodejs.org/api/http.html#http_http_incomingmessage请求参数是 http.IncomingObject 的实例,它实现了节点的可读流接口。正如我上面所做的那样,仅使用 Stream.pipe() 的问题是可读流包含请求标头的纯文本以及请求正文。有没有办法只将请求正文隔离为可读流?
我知道有一些用于文件上传的框架,例如强大的框架。我的最终目标不是创建上传服务器,而是充当代理并将请求正文流式传输到另一个 Web 服务。
提前致谢。
编辑>>
使用busboy的“内容类型:多部分/表单数据”的工作服务器
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');