1文件系統(通過node操作系統文件)
使用文件系統要引入fs模塊 fs時核心模塊,直接引用不需要下載;
fs模塊中所有的操作都有兩種形式可以選擇 同步異步
同步文件系統會阻塞程序執行,也就是除非操作完畢,否側不會向下執行代碼,
異步文件不會阻塞程序執行,而是在操作完成時通過回調函數將結果返回
2buffer(緩衝區)
buffer的結構和數組很像,操作的方法也和數組類似;是一個核心模塊不需要引入模塊
• 從結構上看Buffer非常像一個數組,它的元
素爲16進制的兩位數。
• 實際上一個元素就表示內存中的一個字節。
• 實際上Buffer中的內存不是通過JavaScript
分配的,而是在底層通過C++申請的。
• 也就是我們可以直接通過Buffer來創建內存中的空間。
在buffer中存儲的都是二進制文件.但是在顯示的時候是以16進制顯示的;
buffer大小一旦確定,則不能修改,buffer實際上就是對底層內存的直接操作
var buf=Buffer.alloc(5);//創建一個大小爲5字節的buffer
buf[0]=0xaa;//類似於給數組賦值
buf[1]=88;
//注意:索引大於buffer.length-1時,創建的數據將會消失;
console.log(buf);
var buf1=Buffer.from("hello nodejs");//根據內容創建buffer,根據內容創建大小後,不可以修改,將一個字符串轉換爲buffer
console.log(buf1.length);//返回buf1所佔內存的字節數
var buf3=Buffer.allocUnsafe(5);
//創建一個指定大小的buffer,但是可能會有敏感數據,
// 也就是如果別的程序使用過這一塊內存,在他創建的時候
// 不會清空,有可能包含數據,而alloc在創建的時候就會先清空;
//性能比alloc好,因爲他不清空,而alloc是清空後再創建;
console.log(buf3);
//Buffer.from(str)將一個字符串轉換爲buffer對象
//Buffer.allocUnsafe(size)創建一個指定大小的buffer 可能會造成數據泄露
//Buffer.alloc(size)創建一個指定大小的buffer,相對安全;
3文件系統
• 在Node中,與文件系統的交互是非常重要的,服務器的本質就將本地的文件發送給遠程的客戶端
• Node通過fs模塊來和文件系統進行交互
• 該模塊提供了一些標準文件訪問API來打開、讀取、寫入文件,以及與其交互。
• 要使用fs模塊,首先需要對其進行加載
• fs模塊中所有的操作都有兩種形式可供選擇同步和異步。
• 同步文件系統會阻塞程序的執行,也就是除非操作完畢,否則不會向下執行代碼。
• 異步文件系統不會阻塞程序的執行,而是在操作完成時,通過回調函數將結果返回。
打開狀態
r 讀取文件 , 文件不存在則出現異常
r+ 讀寫文件 , 文件不存在則出現異常
rs 在同步模式下打開文件用於讀取
rs+ 在同步模式下打開文件用於讀寫
w 打開文件用於寫操作 , 如果不存在則創建,如果存在則截斷
wx 打開文件用於寫操作, 如果存在則打開失敗
w+ 打開文件用於讀寫, 如果不存在則創建, 如果存在則截斷
wx+ 打開文件用於讀寫, 如果存在則打開失敗
a 打開文件用於追加, 如果不存在則創建
ax 打開文件用於追加, 如果路徑存在則失敗
a+ 打開文件進行讀取和追加, 如果不存在則創建該文件
ax+ 打開文件進行讀取和追加,如果路徑存在則失敗
4同步寫入實例
/*使用同步方法創建文件
第一步打開文件
fs.openSync(路徑,打開文件要操作的類型("w"可寫/"r"只讀),文件操作權限一般不傳)
返回值:返回一個文件的描述符作爲結果,我們通過描述符對文件進行操作;
第二部寫入並保存文件
fs.writeSync(要寫入的文件標識符,要寫入的字符串內容,[要寫入的起始位置,編碼格式默認utf-8(這兩個參數一般不寫)]);
第三部關閉文件*/
fs.closeSync(要關閉文件的標識符);
const fs = require("fs");//引入模塊
//打開文件
let fd=fs.openSync("hello.txt","w");
//寫入內容
fs.writeSync(fd,"你好世界");
//關閉文件(節約內存)
fs.closeSync(fd);
5異步文件寫入
// 使用異步方法創建文件
var fs=require("fs");
fs.open("hello2.txt","w",function (error,fd) {
console.log(arguments);
//[Arguments] { '0': null, '1': 3 }第一個表示是否成功,如果成功返回null
// 如果出錯,拋出異常
if(error==null){//表示成功
console.log("讀取成功");
fs.write(fd,"你好,nodejs",function (err) {
if(err==null){
console.log("寫入成功");
fs.close(fd,function (erro) {
if(erro==null){
console.log("文件已關閉");
}else{
console.log("文件關閉失敗");
}
});
}else {
console.log("寫入失敗");
}
})
}else{
console.log("讀取失敗");
}
})
6簡單文件寫入
//簡單文件寫入
fs.writeFile(文件路徑及文件名(使用雙斜槓或一個反斜槓),寫入的內容,{改變操作狀態可有可無},回調函數);
//引入模塊
const fs =require("fs");
fs.writeFile("hello4.txt",'這是一個簡單的文件創建',{flag:"w"},function(err){
console.log(arguments);
if(err==null){
console.log("寫入成功");
}else{
console.log('寫入失敗');
}
})
7流式文件
同步,異步,簡單文件寫入都不適合大文件寫入,性能比較差,容易導致內存溢出;
//流式文件
const fs=require("fs");
var wb=fs.createWriteStream("text.txt");//創建流
wb.once("open",function () {
//因爲開啓流只執行一次,所以使用on綁定事件會造成資源浪費
//所以使用once來綁定一個一次性事件,從而提高性能
console.log("流打開了");
})
wb.write("這是通過流式操作寫入的文件");//將內容寫入文件
wb.write("這是通過流式操作寫入的文件");//將內容寫入文件
wb.write("這是通過流式操作寫入的文件");//將內容寫入文件
wb.end();//關閉流
wb.once("close",function () {
console.log("流關閉了");
})
8同步文件讀取(類似於同步文件寫入)
9異步文件讀取(類似於異步文件寫入)
10簡單文件讀取
//簡單文件讀取
const fs=require("fs");
fs.readFile("text.txt",function (error,data) {
//第一個參數是要去讀取的文件,第二個參數是回調函數
//error是返回的狀態,null爲成功,否則拋出異常
//data是如果成功返回的數據
console.log(arguments);
if(error==null){
console.log(data.toString());
}
})
11流式文件讀取
//流式文件讀取
const fs=require("fs");
var rd=fs.createReadStream("text.txt");//可讀流
var wd=fs.createWriteStream("text1.txt");
rd.once("open",function (err) {
console.log("可讀流打開了");
})
rd.once("close",function (err) {
console.log("可讀流關閉了");
})
// rd.on("data",function (data) {
// console.log(data);
// });
//////////////////////////////////////////////////////////////////
//將讀取到的數據給另一個文件
//調用一個方法 pipe 使用可讀流讀到的數據寫入可寫流
rd.pipe(wd);
12其他模塊
fs.existssync()檢查 路徑文件是否存在
fs.stat()是否是一個文件,返回了一個對象,包含所有信息
fs.statsync()
fs.unlink()刪除文件
fs.unlinksync()刪除文件
13簡單的http服務
//使用node可以輕鬆創建一個web服務器
//在node中提供了一個核心模塊:http
//http就是創建編寫服務器的
//1,加載http核心模塊
var http=require("http");
//2,創建一個web服務器,使用http.createServer();返回一個server實例
var server=http.createServer();
//3,服務器要幹嘛?
/*對數據提供服務
發請求
接收請求
處理請求
發送響應
註冊request請求事件
當客戶端發送過來請求request請求事件,然後
執行第二個參數:回調處理函數
回調函數(request)有兩個形參,
request請求對象
請求時,獲取客戶端的一些數據,如請求路徑
response響應對象
響應對象可以給客戶端發送響應信息
注意:響應的數據要麼是字符串,要麼是buffer
*/
server.on("request",function(request,response){
console.log("收到請求了,請求地址"+request.url);
//response有一個方法write可以給客戶端發送響應數據
//write可以使用多次,但是最後一定要用response.end()來結束響應
//否則客戶端會一直等待
response.write("hello node");
response.write("hello javascript");
// response.write("hello 小天才");write只能寫字符串和buffer
response.end("hello");//上面寫入方法基本不用
response.end();
});
//4,綁定端口號啓動服務器
server.listen(3000,function(){
//打印日誌,確認服務器已啓動
console.log("服務器啓動了");
});
14端口號
獲取客戶端端口號request.socket.remotePort;
獲取客戶端的IP地址
request.socket.remoteAddress;
例:客戶端的300端口和服務器的300端口不是一個
注意:端口號的範圍是(0-65536),但是不要佔用一些默認端口號比如http服務的80端口;
可以同時開啓多個服務,但是端口號不能一樣;
15響應中文數據亂碼
其實在服務器默認發送的數據內容是utf-8,
但是瀏覽器不知道我是utf-8編碼的內容
瀏覽器在不知道服務器響應的內容的編碼情況下就會按照當前操作系統的編碼去解析,
中文操作系統默認編碼方式爲gbk
解決方法:
告訴瀏覽器要執行的編碼格式
response.setHeader("Content-Type","text/plain;charset=utf-8");
在http協議中,Content-Type就是告知對方我發的數據是什麼編碼方式,以及響應內容格式;
text/plain 普通文本
text/html 會解析html標籤
content-type對照表http://tool.oschina.net/
圖片就不用設置編碼格式了,但是文件格式要寫;
jQuery小知識
使用jquery獲取的集合如果要使用jquery遍歷,在高版本中使用foreach
在低版本中使用each;獲取到的集合是一個僞數組,但是可以通過方法轉換爲數組;[].slice.call($(“div”));
express基本用法/基本方法
app.use(express.static('public')) //公開靜態目錄
//公開後就可以訪問靜態目錄中的文件,如下例
//http://localhost:3000/css/style.css
如果要使用多個靜態資源目錄,請多次調用 express.static
中間件函數:
然而,您提供給express.static
函數的路徑是相對於啓動node
進程的目錄。如果您從另一個目錄運行快速應用程序,則使用您要提供的目錄的絕對路徑更安全:
app.use('/static', express.static(path.join(__dirname, 'public')))