後端的規範與思想 [toc] 分層 Web層 (接收和發送HTTP請求的,封裝;別名controller層) 業務邏輯層 (別名服務層,文件常以xxxService為名) DAO層 (Date Access Object,數據訪問對象,對對象進行操作,存儲是對象轉為數據,讀取是數據轉為對象) 持久層 ...
目錄
後端的規範與思想
分層
- Web層 (接收和發送HTTP請求的,封裝;別名controller層)
- 業務邏輯層 (別名服務層,文件常以xxxService為名)
- DAO層 (Date Access Object,數據訪問對象,對對象進行操作,存儲是對象轉為數據,讀取是數據轉為對象)
- 持久層 (持久層,將數據長久的保存,如資料庫)
如實現一個登陸功能:
Web層: LoginController接受參數,判斷是否非法,然後傳給服務層
服務層: LoginService通過DAO層從資料庫獲取數據,拿到User和收到的數據進行比對,
DAO層: 從資料庫獲取數據並轉換為對象
Domain: User對象實體
需要遵循單一職責原則
模塊化
導入導出
- ES6支持導入和導出,ES3,5缺乏相關概念
- JS規範缺乏管理機制,不同的庫沒有統一的下載地址
Nodejs的Npm包管理工具能解決這些缺陷(從中央倉庫下載)
node引入系統自帶模塊時,直接require模塊名即可,如果是自己的模塊,則需要帶上路徑:
系統自帶的文件: require("http"); 用戶自定義文件: require("./src/index.js");
想要在另一個文件中引入當前文件的變數,則需要在本文件中將其導出:
導出:module.export = a; //如果導出多個請使用對象 或者使用:exports a; 引入: let a = import("./test.js"); console.log(a)
module.export與exports
- 如果二者同時使用,那麼會導出module.export的值,exports會失效;
- module.exports === exports,說明二者最開始都是空對象且引用同一個對象
但是如果在一個模塊中同時使用兩種導出,那麼他們的所引用的地址就不同了:
如:最開始module.exports和exports同時指向地址0x11111
在模塊中exports=a;module.exports=b;之後,他們的引用地址就不同了(這裡主要是說明分開導出,即寫多個),所以其實無法實現兩種混合導出最後導出對象擁有所有屬性的情況。
因此,應儘量使用module.exports而避免使用exports來導出
為什麼可以直接使用require等模塊?
我們可以直接使用rquire exports module __dirname __filename等這些非系統模塊,他們是在哪裡定義的?
這些都是屬於NodeJS的模塊,而NodeJS的模塊是運行在一個函數之中的,這個函數擁有一些參數,其中包含module等,而我們所寫的內容在這個函數體的中間部分,大致長這樣:
function nodeModule(module,exports,reqiure,__filename,__dirname){
----------
我們所寫的內容
----------
return module.export
}
我們之所以能用這些模塊,是因為被當做參數傳進來了,並且返回的是module.exports,這也就是為什麼exports會失效了
如何證明上述觀點
上面提到模塊是運行在一個函數內,且require等是被當做參數傳遞進來,那麼我們可以嘗試列印arguments,要知道arguments僅能在函數中起作用:
可以看出5個參數分別對應:exports,require,module,__filename,__dirname,可以使用arguments下標去分別驗證(如argument[1]===require)