我有一个问题,输出可读流到http响应。
在后台有来自通用http createServer的常规请求和响应流。我检查一下是否需要。url'以css结尾,我为这个文件创建了一个可读流。我在console.log中看到css内容,其中包含我期望的正确css代码。然后,我尝试将可读的css文件流管道到响应,但在Chrome中,当我检查响应时,文件响应是空白的。这是一个200的回应。乍一看有什么想法吗?我已经尝试了不同的变体,我的代码注释掉。
router.addRoute("[a-aA-z0-9]{1,50}.css$", function(matches){
var cssFile = matches[0];
var pathToCss = process.cwd() + "/" + cssFile;
// takes care of os diffs regarding path delimiters and such
pathToCss = path.normalize(pathToCss);
console.log(matches);
console.log("PATH TO CSS");
console.log(pathToCss)
var readable = fs.createReadStream(pathToCss);
var write = function(chunk){
this.queue(chunk.toString());
console.log(chunk.toString());
}
var end = function(){
this.queue(null);
}
var thru = through(write,end);
//req.on("end",function(){
res.pipe(readable.pipe(thru)).pipe(res);
//res.end();
//});
});
你需要将你的可读流管道到你的直通流中,然后管道到响应中:
readable.pipe(thru).pipe(res);
要准备你的CSS路径,只需使用path。连接而不是连接路径并将其规范化:
var pathToCss = path.join(process.cwd(), cssFile);
我把这个路由(css)从正常的html生成路由中分离出来,我遇到的问题是,我的路由器对象中的正常路由返回字符串,比如res.end(compiled_html_str)
,而css文件可读流也经过相同的路由函数。我把它和路由器隔离开来。
var cssMatch = [];
if(cssMatch = req.url.match(/.+/(.+.css$)/)){
res.writeHead({"Content-Type":"text/css"});
var cssFile = cssMatch[1];
var pathToCss = process.cwd() + "/" + cssFile;
// takes care of os diffs regarding path delimiters and such
pathToCss = path.normalize(pathToCss);
console.log(cssMatch);
console.log("PATH TO CSS");
console.log(pathToCss)
var readable = fs.createReadStream(pathToCss);
var cssStr = "";
readable.on("data",function(chunk){
cssStr += chunk.toString();
});
readable.on("end",function(){
res.end(cssStr);
});
}