Я хочу передать читаемый файл 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);

    });

}
Другие вопросы по тегам