nodeJs之stream

2018-01-29

之前学习了fs文件模块,我们可以通过建立服务器把自己的页面内容通过fs.readFileSync()函数读取出来,再通过res.write(data)把读取文件内容结果输出,这样就可以把页面渲染出来,但是fs模块还是有局限,对于小的文件操作非常方便,但是如果做一个大的项目,牵扯的文件目录多了,fs模块就会非常有局限性,所以就有了下面所介绍的stream流的概念。

可读流fs.createReadStream("2.txt")

  • 创建一个可读流,可以读取文件内容,他可以把文件大小划分流大小来读,这样就可以防止文件读取爆仓。
  • 文件过大会导致渲染页面延迟,所以流的读取方式可以解决这一点。
    1
    2
    3
    4
    5
    6
    7
    8
    var fs=require("fs");
    var rs=fs.createReadStream("2.txt");
    rs.on("data",function(chunk){
    console.log(chunk.toString());//chunk是一个buffer类型的数据,需要转换
    });
    rs.on("end",function(){
    console.log("文件读取完毕");
    });

可写流fs.createWriteStream("3.txt")

  • 创建一个可写流,写的内容为可读流读取的结果,实现简单的文件复制。
  • piep()方法实现流的流动。
    1
    2
    3
    var fs=require("fs");
    var ws=fs.createWriteStream("text");
    rs.pipe(ws);//使用pipe()方法,可以把可读流的读取内容写到可读流里。

爬虫crawler

  • 根据读取文件的这种应用,我们可以读取别的网站,获取别的网站的内容,进而获取到网站数据,做一个简单的呈现.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    var http=require("http");
    var cheerio=require("cheerio");
    function getData(str){
    var $=cheerio.load(str);
    //要爬取的部分内容的类名
    var arr=$(".link-dark");
    var dataTemp=[];
    arr.each(function(k,v){
    var title=$(v).text();
    var obj={
    id:(k+1),
    content:title
    }
    dataTemp.push(obj);
    })
    return dataTemp;
    }
    var server=http.createServer(function(req,res){
    res.setHeader("Content-type","text/html;charset='utf8'");
    //要爬取的网址
    var dataUrl="http://ok.lanou3g.com";
    http.get(dataUrl,function(ress){
    var str="";
    ress.on("data",function(chunk){
    str+=chunk;
    });
    ress.on("end",function(){
    var data=getData(str);
    for(var i=0;i<data.length;i++){
    res.write(`<p>${data[i]['content']}</p>`);
    }
    res.end();
    })
    });
    });

结果照