淺談node ------ (2)

一個遍歷文件夾的簡單demo

const fs = require ("fs");
const path = require("path");
function bfs(dataUrl) {    
    fs.stat(dataUrl , function (err , data) {        
        if(data.isFile(dataUrl)) {            
            console.log(dataUrl);            
            return;        
        }else if (!data.isDirectory(dataUrl)) {            
            return;        
        } else {            
            fs.readdir(dataUrl , function (err , data) {                
                data.forEach(function (item , index) {                    
                    bfs(path.resolve(dataUrl , item));                
                })             
            })        
        }    
    })
}
bfs("./dir");複製代碼

path是一個自動補全路徑的模塊css

今天接着上篇文章,講講fs模塊裏的stream,watch,和http。html

Stream

fs.createReadStream()

node讀取文件採用流形式,就是每64k讀取一次node

const rs = fs.createReadStream("./111.txt" , 
            {    
               encoding : "utf-8",    
               start : 10,    
               end : 200
            });

rs.on("data" , function (data) {    
    console.log(data);
})複製代碼

這段代碼的意思是建立一個流對象,從文件111.txt的第10位開始讀取文件,讀取到第200個字符(注意,一箇中文佔三個字符,當心輸出亂碼)css3

//暫停讀取
rs.pause();

//回覆讀取 resume()
setTimeout(function () {    
    rs.resume();
}, 1000);複製代碼

另外一種讀取文件的方法,和上面的data事件效果相同npm

rs.on("readable" , function () {    
    var data = rs.read();    
    console.log(data)
})複製代碼

讀取文件結束gulp

rs.on("end" , function () {   
 console.log("end")
})複製代碼

fs.createWriteStream()

穩健的寫入也是採用建立流對象進行寫入的方式瀏覽器

const wf = fs.createWriteStream("./222.txt" , {    
    flags : "a" , //a表示拼接,w表示覆蓋原文件 
});

複製代碼

文件開始讀寫
rf.on("data" , function (data) {    
    wf.write(data);
})
rf.on("end" , function () {    
    wf.close();
})複製代碼

文件讀寫的等效bash

rf.pipe(wf)複製代碼

watch

watch是一個監聽文件變化的方法,一個簡易的gulp內部機制以下服務器

const fs = require("fs");
fs.watch("./111.txt" , "utf-8" , function (eventType , fileName) {    
    console.log(eventType,fileName);    
    const rf = fs.createReadStream("./111.txt");    
    const wf = fs.createWriteStream("./222.txt");    
    rf.on("data" , function (data) {        
        wf.write(data);    
    })    
    rf.on("end" , function () {        
        wf.close();    
    })    
    //rf.pipe(wf)
})複製代碼

這就是一個簡單的相似gulp監聽文件修改的實現,回調函數第一個參數是文件的改動的類型,第二個參數是文件名函數

監聽css文件,我用了autoprefixer和postcss插件,命令行cnpm安裝一下就行,j就是給css3添加兼容性的前綴

const fs = require("fs");
const autoprefixer = require("autoprefixer");
const postcss = require("postcss");

fs.watch("index.css", function (eventType, fileName) {    
    fs.readFile("./index.css" , function (err , css) {        
        postcss([ autoprefixer ]).process(css).then(function (result) {            
            result.warnings().forEach(function (warn) {                
                console.warn(warn.toString());            
            });            
            fs.writeFile("./index1.css" , result.css)        
        });    
    })
}) 複製代碼

http模塊

首先咱們須要引入node內置的http模塊

const http = require("http");複製代碼

咱們先開啓一個本地的服務器

const server = http.createServer(function (req , res) {
    res.end("server is created")
})
server.listen(3000)複製代碼

回調函數的兩個參數分別是請求和響應,res.end返還了相應的主體資源,你會在相應的本地3000端口上看到server is created這句話。

另外一種寫法,採用事件的方式

const server = http.createServer();
server.on("request" , function (req , res) {
       res.end("server is created")
})複製代碼

其中請求(req)有幾個屬性,咱們能夠打印查看一下

console.log(req.headers);//請求頭
console.log(req.url);//請求域名
console.log(req.method);//請求的方法
console.log(req.httpVersion);//http協議版本號
複製代碼

服務端讀取客戶端發來的請求的數據也是以流對象的形式,即每64k讀取一次

var reqBody = '';    
req.on("data" , function (data) {        
    reqBody += data;    
})    
req.on("end" , function () {        
    console.log(reqBody);    
})複製代碼

服務器響應客戶端請求,返還請求的數據,會拼接在響應主體以前,必須在end以前,不然會報錯

res.write("some ahead of res.end");複製代碼

響應完畢,返還數據,沒有end瀏覽器會一直請求

res.end("all res data");複製代碼

還有一些設置響應的設置

res.statusCode = 200; //設置響應狀態碼
res.statusMessage = "success"; //響應狀態信息
res.setHeader("content-Type" , "test.html");//設置響應頭複製代碼

處理服務器端口關閉的方法,通常用於端口的異常關閉手機報錯信息等

server.on("close" , function () {
    ...some code;
})複製代碼
相關文章
相關標籤/搜索