我正在使用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');
根据node的文档,a请求参数是http的一个实例。IncomingObject实现了节点的可读流接口。正如我上面所做的那样,只使用stream.pipe()的问题是,可读流包括请求头的纯文本以及请求体。是否有一种方法可以仅将请求体隔离为可读流?
我知道有框架的文件上传,如可怕的。我的最终目标不是创建一个上传服务器,而是充当一个代理,并将请求体流式传输到另一个web服务。
thanks in advance.
编辑>>"Content-type: multipart/form-data"的工作服务器使用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');
检查您的req.headers['content-type']
。如果是multipart/form-data
,那么你可以使用像busboy这样的模块来为你解析请求,并为文件部分提供可读流(如果存在,则为非文件部分提供纯字符串)。
如果内容类型是其他multipart/*
类型,那么您可以使用dicer,这是busboy用于解析multipart的底层模块。