我想将一个可读的css文件传递给http响应

时间:2014-05-02 20:07:16

标签: node.js http stream readable

我在将可读流输出到http响应时遇到问题。

在幕后,有来自通用http createServer的常规请求和响应流。我检查'req.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();
    //});


});

2 个答案:

答案 0 :(得分:1)

您需要将可读流传输到整个流中,然后将其传输到响应中:

readable.pipe(thru).pipe(res);

编辑:为了准备你的css路径,只需使用path.join而不是连接你的路径并将其规范化:

var pathToCss = path.join(process.cwd(), cssFile);

答案 1 :(得分:0)

我从正常的html生成路由中分离出这条路径(css),我遇到的问题是我的路由器对象中的正常路由返回字符串,如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);

    });

}