0

我在将可读流输出到 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();
    //});


});
4

2 回答 2

1

您需要将您的可读流通过管道传输到您的直通流中,然后将其传输到响应中:

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

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

var pathToCss = path.join(process.cwd(), cssFile);
于 2014-05-02T20:31:49.763 回答
0

我将这条路由(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);

    });

}
于 2014-05-02T22:15:04.007 回答