Я хочу передать читаемый файл CSS в ответ http
У меня проблема с выводом читаемого потока в ответ http.
за кулисами есть регулярные потоки запросов и ответов, поступающие с универсального http createServer. Я проверяю, заканчивается ли 'req.url' на css, и создаю читаемый поток этого файла. Я вижу содержимое css в console.log, с правильным кодом 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();
//});
});
2 ответа
Вам нужно направить ваш читаемый поток в ваш сквозной поток, а затем направить его в ответ:
readable.pipe(thru).pipe(res);
edit: для подготовки вашего пути css, просто используйте path.join вместо того, чтобы объединять ваш путь и нормализовать его:
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);
});
}