對於前端開發來講,web應用咱們並不陌生。今天想要討論一下,在開發一個web應用的時候,咱們須要一些基本的知識儲備。咱們知道,一個web應用脫離不了(request)請求和響應(response),咱們全部想要的的東西,想作的事情都脫離不了它們。那麼咱們具體須要關注那些知識點呢?在nodejs中,又是怎麼實現和運用的呢?下面咱們詳細瞭解一下。
1.請求方法
使用瀏覽器訪問任意一個網站,抓包查看網絡請求,都會在request header報文中發現這麼一行
GET / HTTP/1.1 //訪問http://www.so.com的結果
//第一個是請求方法;第二個是訪問路徑;第三個是HTTP版本號
第一個值就是咱們這裏要說的請求方法,咱們能夠經過監聽node服務的連接,來響應用戶的請求。
function(req, res) {
//使用req.method接收不一樣類型的請求,並作相應的處理
//method的值有:GET POST PUT CONNECT DELETE
}
上面的作法,能夠根據請求方法將業務邏輯分發。
2.路徑解析
在請求方法中,也講到請求報文第一行第二部分的值就是該請求的路徑。咱們node服務器在接收到這個路徑請求的時候,會經過兩種形式來響應請求。
第一種是靜態文件,能夠經過路徑直接讀取文件內容,而後給出響應。
須要注意的是,在nodejs中url模塊能夠處理url相關的操做。
var url = require('url');
var fs = require('fs');
function(req, res) {
var pathname = url.parse(req.url).pathname;
fs.readFile(pathname, function(err, file) {
if(err) {
//返回404
return;
}
res.end(file); //正常返回
});
}
第二種,就是本身實現一種路由規則,當訪問某個地址的時候,根據定義的路由規則讀取不一樣的資源,而後給出相應的響應。
3.查詢字符竄
仍是在請求報文第一行的第二部分,除了有路徑以外,還會存在一些咱們須要傳遞的參數--也就是查詢字符串。一樣node提供了querystring模塊,處理這部分數據。
var url = require('url');
var querystring = require('querystring');
function(req, res) {
var query = querystring.parse(url.parse(req.url)).query;
//注意查詢字符串中的鍵出現屢次,結果是一個數組
}
4.cookie與session
cookie的設置存在兩種狀況,第一種經過服務端的set-Cookie給瀏覽器設置cookie,第二種則是瀏覽器腳本(javascript),兩種設置的最終效果是相同的。
關於cookie的基本使用我就不作過多說明了,主要注意一下幾點:
- 每次瀏覽器都會把cookie發送給服務端
- cookie設置了http-only的話,前端不能經過document.cookie進行獲取
- cookie設置secure爲true時,只能經過https傳輸
- cookie的安全問題,防止xss和csrf問題出現
cookie自己沒有大小限制,他的全部限制來自瀏覽器和服務器的配置。固然合理的使用cookie才能對頁面的性能和安全有保障。
session是爲了解決cookie大小和安全性的一種方案,他是服務端生成的,存在於內存中。他也可使用一些加密算法,讓session更加安全的傳輸。爲了解決session的共享問題,咱們一般會使用memacha、redis等第三方工具來管理。在nodejs中,自己並無提供session功能,可使用session模塊來使用。
5.緩存
在B/S模式中的頁面,不少狀況下不會頻繁的更新,這個時候若是每次訪問都要請求的話,一方面對資源是一種浪費,另外一方面可能花費比較長的時間,隨意緩存技術就應運而生啦~
爲了提升性能,YSlow有這麼幾條緩存的規則:
存在的問題:首先這個時間自己存在偏差,其次可能個人修改時間變了,可是個人內容沒有變化,個人本意是隻有在內容發生變化的時候纔會從新請求,這種方式的話,就會增長一部分請求。
解決的問題:解決過時時間存在的問題,這個值是服務器設置的,在nodejs中,須要本身實現。原理是檢測到文件改變纔會調整這個的值,反之保持不變。
問題:確認一次請求不會改變的數據才作緩存,若是對數據實時性要求比較高的話,就不能使用了,因此使用起來必定要謹慎。
總結說來,以前咱們使用的apache、nginx幫咱們處理不少,咱們不須要關心的配置。而在nodejs中,這些都須要本身實現。
參考資料:
《深刻淺出nodejs》--構建web應用