基於nodejs的服務端開發已經有express、koa2等成熟框架。熟練使用這些框架並不難,但背後的原理是怎樣的,很多同學並沒有做到知其所以然。本分享注重原理,從細節摳起來,循序漸進,特別適合零基礎的同學。在掌握原理後,再去學習express、koa2框架,會理解得更加透徹。本次主題為如何基於nodejs實現處理GET、POST請求。
按照步驟一步步來,就會很快掌握~來加油吧!
1 初始化項目
1.1 創建項目目錄
找個喜歡的地方,新建並初始化項目,執行以下命令:
1.2 編寫服務腳本
在項目根目錄下創建bin/www.js。
啟動web服務需要使用nodejs的http模塊,打開 bin/www.js 編寫代碼:
配置入口文件,修改package.json
【關於main字段】
官方說明的原文是這樣的:
The main field is a module ID that is the primary entry point to your program. That is, if your package is named foo, and a user installs it, and then does require("foo"), then your main module’s exports object will be returned.
This should be a module ID relative to the root of your package folder.
For most modules, it makes the most sense to have a main>
翻譯大致意思是:
main字段是一個模塊ID,是指向你程序的主入口。也就是說,如果你的package名叫foo,那麼一個用戶安裝了你這個package,並且執行require("foo"),你的main模塊的exports對象將會被返回。
這個模塊ID應該相對於你的package根目錄。
對於大多數的模塊來說,設置main還是非常有意義的,除此之外也沒有其他鳥用了。
【關於script字段】
官方說明的原文是這樣的:
The “scripts” property is a dictionary containing>
scripts是一個包含了腳本命令的dictionary,可以在package不同的生命週期中被執行。key是生命週期事件,value是要運行的命令。
英語比較好的同學可以參看官方原文:https://docs.npmjs.com/files/package.json
回到我們的項目來,項目的主入口文件是./bin/www.js。
現在,在項目根目錄下執行npm run dev,就等同於執行node ./bin/www.js。 執行後,在控制檯可以看到輸出,說明服務已經正常啟動:
瀏覽器打開http://localhost:8000,出現“hello nodejs”。
2 設置服務自動熱啟動
每次修改代碼都要重啟服務器才能生效很麻煩,使用nodemon來實現自動監測代碼變化並重啟。
另外,安裝cross-env可以方便的跨平臺設置環境變量(例如,windows用%ENV_VAR%,其他系統可能使用$ENV_VAR,不統一)
修改package.json:
再次執行npm run dev的時候,如果代碼有改動,web服務會自動重啟,這樣就方便多啦。
3 處理GET請求
瀏覽器訪問http://localhost:8000?id=1&name=demo,相當於我們發送了一個GET請求,並且傳遞了兩個變量和值。
接下來我們實現:接收GET請求,並把GET請求傳遞的數據再返回給瀏覽器。
修改bin/www.js:
瀏覽器訪問http://localhost:8000?id=1&name=demo,可以看到返回的數據了。
【原理講解】
接收GET請求數據還是很簡單的,關鍵點就是使用const query = querystring.parse(url.split('?')[1])把url中?後面的參數直接解析好了。
4 下載安裝postman
因為POST請求不能像GET請求一樣通過瀏覽器的URL直接發起請求,所以在講解處理POST請求之前,我們先postman這個工具軟件。
postman是一款可以模擬各種請求的工具,方便我們進行POST調試,否則我們還要去做一個靜態頁。通過ajax等方式去請求。
官方建議下載桌面端APP,www.getpostman.com/downloads/
5 處理POST請求
啟動postman,我們把請求方式改為POST,輸入請求地址http://localhost:8000/。
點擊下方的Body標籤,可以看到發起POST請求的content-type有好多種。
這裡我們以application/json和form-data為例,分別講解如何接收POST數據。
5.1 接收application/json數據
首先我們要知道的是,POST數據是以二進制流的方式進行傳輸,所以要不斷的接收數據,直到數據流結束。
修改bin/www.js:
【原理講解】
- 通過req.headers['content-type']獲取請求的數據格式,如果是applicatin/json則進入下面的邏輯。
- 創建postData變量,用來存儲post數據。
- 在接收數據流的時候,會不斷觸發request的data事件,postData持續累積數據。
- 當數據流接收完畢,會觸發request的end事件,返回給客戶端最終結果。
按照下圖設置postman:
點擊Send後,可在下方看到返回的JSON數據。
切換到Header標籤,可以看到返回數據的content-type為application/json。
5.2 接收form-data數據
在項目開發時,特別是jQuery項目,我們經常使用formData提交數據,例如:
如果用5.1章節的方式,接收到的數據是這樣的:
需要我們自行解析,比較麻煩。這裡推薦安裝multiparty插件。
修改bin/www.js:
【原理講解】
1.為何使用contentType.indexOf('multipart/form-data') !== -1來判斷是不是multipart/form-data類型?
因為通過form-data提交的數據content-type的值是類似
multipart/form-data;boundary=----WebKitFormBoundaryMxVY9JCuXKMvmRuL
的形式,因此使用indexOf()。
2.let form = new multiparty.Form()可方便的解析form-data數據。fields裡可以獲取提交的數據變量及值,files裡獲取提交的文件數據。
3.使用JSON.stringify()將對象轉化為JSON字符串返回給客戶端。
點擊Send之後,可以看到數據已經正常返回了。
以上就是本期分享,對GET和POST請求的處理方式進行了講解。這是基於Node.js開發後端服務最最基本的功能了,希望對你有所幫助。
閱讀更多 臥梅又聞花 的文章