NODE 構建Web應用

構建web應用會遇到的問題

請求方法的判斷

URL路徑的解析

URL中查詢字符串的解析

Cookie的解析

表單數據得解析

任意格式文件的上傳處理

會話的需求


請求方法

web請求方法存在于報文的第一行的第一個單詞,通常大寫

curl -v url

HTTP_Parser在解析請求報文的時候,將報文抽取出來,設置為req.method。存在的相應有POST、DELETE、PUT、GET。

PUT代表新建一個資源,POST表示要更新一個資源,GET表示查看一個資源,而DELETE表示刪除一個資源


路徑解析

客戶端代理(瀏覽器)會將這個地址解析成報文,將路徑和查詢的部分放在報文的第一行。最常見的根據路徑進行業務的應用是靜態文件服務器,它會根據路徑去查找磁盤中的文件,然后將其相應給客戶端

http://user:pass@host.com:8080/p/a/t/h?query=string


查詢字符串

查詢字符串位于路徑之后,在地址欄中路徑后的?foo=bar&baz=val字符串就是查詢字符串

這個字符串會跟隨在路徑之后,形成請求報文首行第二部分,為業務邏輯所用

Node提供了queryString 模塊用于處理這部分數據

var url = require('url');

var querystring = require('querystring');

var query = querystring.parse(url.parse(req.url).query);

它會將查詢字符串解析成一個JSON對象

{

foo:'bar',

baz:'val'

}


Cookie & Session

HTTP是一個無狀態協議,業務邏輯需要一定得狀態來區分用戶身份。

Cookie的處理分為以下幾步:

服務器像客戶端發送Cookie

瀏覽器將cookie保存

之后每次瀏覽器都會講Cookie發向服務器

cookie值得格式為 key = value;key=value形式


服務器告知客戶端設置cookie的值,在Set-Cookie字段中

Set-Cookie字段的格式為

Set-Cookie:name=value;Path=/; Expires=Sun, 23-Apr-23 09:01:35 GMT; Domain=.domain.com;

其中name=value是必須包含的部分,其余部分皆是可選參數。參數的意義:

path:表示這個Cookie影響的路徑,當前訪問的路徑不滿足改匹配時,瀏覽器不發送這個Cookie

Expires和Max-Age 告知瀏覽器這個Cookie何時過期,如果不設置該選項,在關閉瀏覽器時會丟失掉這個Cookie

HttpOnly 告知瀏覽器不允許通過腳本document.cookie來更改Cookie值。

Secure 當secure設置為true,在HTTP請求中這個Cookie是無效的,HTTPS中才有效


Cookie的性能影響:

由于Cookie的實現機制,一旦服務器向客戶端發送了設置Cookie的意圖,除非Cookie過期,否則客戶端每次請求都會發送這個寫Cookie到服務器端,一旦設置Cookie過多,會導致報文較大。

針對該問題做一下幾點優化

減小Cookie的大小 ?: 限定Cookie域

為靜態組件使用不同的域名: ?換域名減少無效Cookie的傳輸,引入的問題域名轉換為IP需要DNS查詢,多一個域名多一次DNS查詢

減少DNS查詢: ?沖突規則,現在瀏覽器都會進行DNS緩存

Cookie除了服務器可以設置,客戶端也可以通過Document.cookie進行修改,修改后,在后續的網絡請求中就會攜帶上修改后的值


Session

Cookie的缺點,1.會存在體積過大 2 前后端都可進行修改,數據容易被篡改和偽造

Session 的數據只保留在服務器端,客戶端無法進行修改,數據也無須在協議中每次都被傳遞

利用Session如何將每個客戶端與服務器對應起來,常見有以下方式

1.基于Cookie來實現用戶和數據得映射

cookie中只存放口令,服務器接受到Cookie口令去找對應的Session。

這是目前大多數web應用的方案,如果客戶端禁止使用Cookie,瞎

2.通過查詢字符串來實現瀏覽器和服務器端數據的對應。風險比較大


Session 與內存

session引入的問題

1.Session 存放在內存中,用戶量增多,內存量的數據會加大,會引起垃圾回收的頻繁掃描,影響性能。極端會耗盡內存

2.利用多核CPU開啟多個進程啟動服務,用戶的連接請求會被隨意分配到各個進程中,Node的進程與進程之間不能直接共享內存,用戶的Session可能會引起混亂,這種問題通過Session集中化,將Session存在緩存中,目前redis,memcached等


數據上傳

Node的http模塊只對HTTP報文的頭部進行解析,然后觸發request事件,如果請求中還帶有內容部分,內容部分需要用戶自行接受和解析。可以通過Transfer-Encoding或Content-Length即可判斷請求中是否帶有內容

表單數據

最為常見的數據提交是網頁表單提交數據到服務器端

默認的表單提交,請求頭中的Content-Type字段值為applicant/x-www-form-urlencoded

由于它的內容跟查詢字符串相同

req.body = query string.parase(req.rawBody);

后續的業務直接訪問req.body就可以


其他格式

除了表單數據外,常見的提交還有JSON/XML文件等,判斷和解析的原理都是依據content-type中的值決定。

其中JSON類型的值為application/json ,XML 的值為 application/xml

附件上傳

附件的上傳表單中含有file類型控件,以及需要制定表單屬性encpty為multipart/form-data

瀏覽器在遇到multipart/form-data表單提交時,構造的請求報文與普通表單完全不同,其中報頭

content-type:multipart/form-data; boundary=AaBo3x

content-length:18321;

它代表本次提交內容是由多部分構成,其中boundary代表每部分的分界符,隨機產生。

流式解析報文,這里提到的模塊為formidable。將接受到的文件寫入到系統臨時文件夾中,并返回對應的路徑。

數據上傳內存問題

內存限制:數據上傳請求并發量大如果文件存放在內存中,服務器內存很快耗盡。

解決方案:1.限制上傳內容的大小。2.采用流式解析,將數據流導向磁盤匯總,Node只保留文件路徑等小數據


路由解析

文件路徑型

1.靜態文件

請求路徑對應服務器文件,比較簡單

2.動態文件

web服務器根據URL路徑找到對應的文件,WEB服務器根據文件名后綴去尋找腳本的解析器,并傳入HTTP請求的上下文。

MVC

用戶的請求的URL路徑可以跟具體的腳本所以得路徑沒有任何關系。

use('/user/setting', exports.setting);

MVC模型叫業務邏輯按職責分離

工作模式如下:

路由解析,根據URL尋找到對應的控制器和行為。

行為調用相關的模型,進行數據操作

數據操作結束后,調用視圖和相關數據進行頁面渲染,輸出到客戶端。

URL 做路由映射,有兩種方式1.手工關聯映射。2.自然關聯映射。

優缺點:手動映射,如果項目較大,路由映射的數量也會很多,從路徑到具體的控制器,需要查看代碼才能知道。 自然關聯映射,如果URL變動,文件也需要變動,手工映射只需要更改路由映射即可

RESTful

representational state transfer 表現層轉態轉化

設計哲學主要將服務端提供的內容實體看做一個資源,并表現在URL上

例如:

/uses/jacksontian

這個地址代表一個資源,對這個資源的操作,主要體現在HTTP請求方法上,不體現在URL上。

過去對用戶的增刪改設計的URL為

POST ?/user/add?username=jack

GET ? /user/remove?username=jack

POST ?/user/update?username=jack

GET ? ?/user/get?username=jack

在RESTful設計中如下:

POST? /user/jack

DELETE ? /user/jack

PUT ?/user/jack

GET? ? /user/jack

將DEL PUT 請求方法引入到設計中,參與資源的操作和更改資源狀態

RESTful是對MVC更好的改進,相比較,只是將HTTP請求的方法加入了路由的過程,以及在url路徑上體現的更資源化


中間件 ? 自看


NODE 學習參考

1.Node.js 開發指南

2.深入淺出 node.js

3 Node.js實戰

https://github.com/yantao608/myblog

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容