1. 程式人生 > >node筆記(二)

node筆記(二)

node 二

一 同步與非同步的對比

非同步:非同步讀取檔案 讀取檔案的程式碼的順序不一定和輸出的結果順序一樣

同步:同步讀取檔案 同步讀取檔案會有返回值,我們可以通過變數接受,順序是一一對應的,同步讀取檔案,因為立馬有返回值,所以他是在主執行緒中進行程式碼執行的,主執行緒中異常可以通過異常處理來捕獲並且進行處理

二 異常處理結構,處理同步讀取檔案的結構

1 try(

	嘗試執行的程式碼塊,如果沒有錯誤就將這個程式碼執行完畢

)

2 catch(exp){

如果有錯,就會使用catch結構,捕獲異常並進行異常處理

}

其中(exp)指的就是,如果有錯誤,所返回錯誤物件

3 finally{

無論如何都會執行的程式碼	

}

try{

	//只要有錯誤,就立馬進行跳轉到catch

	var b = fs.readFileSync('./data/bb.txt','utf-8')

	console.log(b)

}

//e就是有錯誤,所返回的錯誤物件

catch(e){

	console.log('這個檔案讀取失敗')

}

finally{

	console.log('無論如何都會被執行')

}

三 重點 node模組

1 核心模組	直接引入然後呼叫方法即可

2 第三方模組	先下載,然後再引用

3 自定義模組

1) 在物件裡面掛載成員	

掛載成員的方式:

1 global:不建議使用,它就相當於node中的全域性變數成員,每個node中的檔案都可以使用,同時它是一個物件,就相當於是window

global的缺點:使用的時候,成員不明確;後面引用的同名成員會將前面的同名成員覆蓋;將所有的成員掛載到一個物件上,不方便後期的管理

2 在沒個慕課穿件之後都會有一個內建物件,這個內建物件在外部引用模組的時候會自動返回

1 exprots

2 module.exprots

module.exprots = ()=>{

	需要封裝的功能程式碼函式

}

總結:建議不要用重置物件的模式去重置物件

例如:

	exprots = ()=》{}

建議:用	. 的語法去使用		

四 node的載入規則

1 優先載入快取	如果快取中有當前需要的模組,那麼直接從快取中獲取,如果沒有,那麼載入模組,並將模組儲存到快取中

2 載入核心模組	優先從快取中載入,如果沒有的話,再去執行載入慕課核心模組

3 自定義模組載入規則

	優先從快取中載入,如果快取中沒有的話,再去載入使用者模組

	載入模組的時候,預設會載入這個目錄下的index檔案

	index > index.jx > index.json > index.node > 崩

4 第三方模組載入規則 

	1 先查詢當前目錄中node_modules

	2 如果有,就查詢同名的資料夾

	3 查詢檔案中的package.json檔案

	4 查詢package.json中main屬性。這個屬性所指向的路徑

	5 載入這個檔案,main屬性指向的

	6 找不到對應檔案,或者沒有package.json檔案,或者沒有main屬性,或者main屬性指向的檔案不存在,就會預設載入這個目錄下的index檔案

	7 如果壓根都沒有直達模組資料夾,或者壓根就沒有node_modules資料夾,就會查詢上一級目錄,如果上一級沒有,再往上級目錄,知道這個目錄所在的碟符根目錄(查詢只能只往上,不會在查詢的過程中往下)

	8 如果再沒找到就只能報錯

四 重點 模板引擎

1 模板引擎	

	先下載模板引擎	npm install art-template

	引入模板		var template = require('art-template')		

2 然後就是呼叫模板API

	API 一:

		var render = template.complie(模板內容);返回一個函式render

		var result = render(資料物件);返回渲染的結果



	API二:

		var result = tempalte.render("模板內容,資料");返回的是渲染的結果

	

	API三:

		var result = template(模組路徑,資料)

五 注意:

1 在for迴圈裡面使用非同步方法,迴圈會先執行,會導致索引越界

2 在for迴圈裡面。把var 變成 let ,裡面的i值,會變成有作用域,以此來處理索引越界的問題

3 不要使用for裡面的i值去判斷是否讀取完畢的判斷,因為是非同步請求,所以不確定是否能夠都及時返回,需要判斷的時候,用count計時器去判斷

4 ...解構   拆元素,可以用於在連結兩個陣列

	也可以用concat()方法去

	all = all.concat(all2);//all和all2代表的是兩個不同的陣列

	all.phsu(...all2);

5 sort(),進行數組裡面排序。首先得先在sort()裡面傳遞一個函式,函式為定義排序的規則

如	function sortAll(x,y){

		if(x.size>y.size){

			render -1

		}else{

			render 1

			}

	}

賦值:

	all.sotr(sortAll)

node(三)

一 node中的樣式檔案

1 在node中,資料會根據副檔名進行自動的編碼格式的處理

二 indexOf()

1 在陣列中,出現的時候,返回1,不存在的情況下就返回-1

2 獲取索引為0的格式

url.indexoF('/images')===0

獲取的是,以'./images'開頭的程式碼

三 關於上傳檔案

1 獲取檔案 

var myfile = document.getElementById("img").files[0]

2 建立formdata  收集使用者資料,作為引數傳遞

var data = new FormData()

3 formdata的append方法,新增檔案

data.append('myimg',myfile)

4 重點強調:如果是使用FormData結合ajax使用,那麼必須在發起請求的時候新增多兩個屬性

processData:false;//不要ajax來處理資料,由formdata進行處理

contentType:false;//不要ajax進行資料的編碼,由formdata進行編碼處理