1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
node.js實(shí)現(xiàn)web服務(wù)器還是比較簡單的,我了解node.js是從《node入門》開始的,如果你不了解node.js也可以看看!
我根據(jù)那書一步一步的練習(xí)完了,也的確大概了解了node.js,不過里面寫的路由的地方總感覺不方便,十一放假最后一天,試著寫了個(gè)簡單的web服務(wù)器,現(xiàn)在分享記錄于此!
http模塊已提供了基本功能,所以我主要解決兩個(gè)問題,1是靜態(tài)資源的處理,2是動(dòng)態(tài)資源的路由。
靜態(tài)資源在node.js里的意思是不變的,如圖片、前端js、css、html頁面等。
動(dòng)態(tài)資源我們一般指aspx頁面,ashx頁面,asp頁面,jsp頁面,php頁面等,而node.js里其實(shí)沒動(dòng)態(tài)資源這一說,它對請求的處理都是由回調(diào)方法完成的,在我實(shí)現(xiàn)的httserver里,借鑒了ashx的寫法,把處理請求的js文件看作動(dòng)態(tài)資源。
首先實(shí)現(xiàn)一個(gè)處理靜態(tài)資源的函數(shù),其實(shí)就是對本地文件的讀取操作,這個(gè)方法已滿足了上面說的靜態(tài)資源的處理。
//處理靜態(tài)資源
function staticResHandler(localPath, ext, response) {
fs.readFile(localPath, "binary", function (error, file) {
if (error) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.end("Server Error:" + error);
} else {
response.writeHead(200, { "Content-Type": getContentTypeByExt(ext) });
response.end(file, "binary");
}
});
}
而動(dòng)態(tài)資源肯定不能一個(gè)方法搞定,就像你的網(wǎng)站有register.aspx、login.aspx等等,都需要你自己來寫,在我的httpserver里,每個(gè)處理請求的js模塊都導(dǎo)出processRequest(request,response)即可,比如實(shí)現(xiàn)一個(gè)register.js(只輸出字符串register)
exports.processRequest = function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/plain' });
resp.end("register");
}
現(xiàn)在當(dāng)請求到來時(shí),我們要做的就是決定怎么處理,即路由。
因?yàn)殪o態(tài)資源url指定靜態(tài)資源大家都很習(xí)慣了,所以這里不變,比如
訪問http://localhost/img/logo.png 就是訪問 web根目錄\img\logo.png;
訪問http://localhost/js/what.js 就是訪問 web根目錄\js\what.js;
而動(dòng)態(tài)資源也是一般的js文件,即服務(wù)器端js,就比如我實(shí)現(xiàn)的這個(gè)httpserver.js和上面說的register.js都是不應(yīng)該讓用戶訪問的,所以路由的時(shí)候要判斷,就是一些if、else,簡單而強(qiáng)大是我的最愛,這里只看最后的的判斷,
fs.exists(localPath, function (exists) {
if (exists) {
if (staticRes) {
staticResHandler(localPath, ext, response); //靜態(tài)資源
- 1 回答
- 0 關(guān)注
- 858 瀏覽
添加回答
舉報(bào)