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
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")
})複製代碼
穩健的寫入也是採用建立流對象進行寫入的方式瀏覽器
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是一個監聽文件變化的方法,一個簡易的gulp內部機制以下服務器
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)
});
})
}) 複製代碼
首先咱們須要引入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;
})複製代碼