使用node.js搭建服務(wù)器
使用node搭建小型服務(wù)器(其實(shí)就是分析url然后輸出文件給客戶端)
最近需要完成一個(gè)課程設(shè)計(jì),被項(xiàng)目經(jīng)理(組長(zhǎng))分配寫界面,但是總覺得只寫前端的話缺了點(diǎn)什么,所以想自己寫下后端玩一下。
期間還稍微糾結(jié)了一下用什么語言,本來打算正好學(xué)習(xí)一下PHP,可后來轉(zhuǎn)念一想,用nodejs豈不美哉,不僅了解了后臺(tái)開發(fā),也相當(dāng)于鞏固了js基礎(chǔ),一舉兩得,美滋滋。
在學(xué)習(xí)node的過程中,學(xué)到了使用node實(shí)現(xiàn)一個(gè)服務(wù)器這一塊,感覺是對(duì)前面所學(xué)模塊的一個(gè)很好的總結(jié)。用到了四個(gè)基本的模塊fs stream http path
代碼如下:(內(nèi)含蹩腳英文注釋請(qǐng)見諒)
'use strict' var url = require('url'); var path = require('path'); var fs = require('fs'); var http = require('http'); //get the current path //var root = path.resolve('.');//以當(dāng)前的目錄為服務(wù)器的根目錄 var root = path.resolve(process.argv[2] || '.');//以輸入的參數(shù)作為服務(wù)器的根目錄,如果沒有輸入?yún)?shù)就將當(dāng)前目錄作為服務(wù)器根目錄 console.log('local root dir :' + root); //create server var server = http.createServer(function(request, response) { //get the path of URL var pathname = url.parse(request.url).pathname; //get the local path var filepath = path.join(root, pathname); //get the file stat and output the request file by callback function fs.stat(filepath, function(err, stat) { if(!err && stat.isFile()) { console.log('200' + request.url); response.writeHead(200); fs.createReadStream(filepath).pipe(response);//沒有必要手動(dòng)讀取文件內(nèi)容。由于response對(duì)象本身是一個(gè)Writable Stream,直接用pipe()方法就實(shí)現(xiàn)了自動(dòng)讀取文件內(nèi)容并輸出到HTTP響應(yīng)。 } else { console.log('404' + request.url); response.writeHead(404); response.end('404 Not Found'); } }); }); server.listen(8080); console.log('Server is running at http://127.0.0.1:8080/');
對(duì)于其中一些函數(shù)的解釋:
path.resolve() 路徑尋航(這名字不錯(cuò)) path.resolve([from…], to)
有個(gè)解釋很有趣:相當(dāng)于不斷地調(diào)用系統(tǒng)的cd指令
eg:
path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile') //相當(dāng)于: cd foo/bar cd /tmp/file/ cd .. cd a/../subfile1 path.join([path1],path[2]...) 路徑合并
將所有名稱用path.seq串聯(lián)起來,然后用normailze格式化
eg:
path.join('///foo', 'bar', '//baz/asdf', 'quux', '..'); =>'/foo/bar/baz/asdf'
既然提到了normalize
那么:
格式化路徑 path.normalize(p)
將不符合規(guī)范的路徑格式化,簡(jiǎn)化開發(fā)人員中處理各種復(fù)雜的路徑判斷
eg:
path.normalize('/foo/bar//baz/asdf/quux/..'); => '/foo/bar/baz/asdf'
http.response.end()結(jié)束相應(yīng),告訴客戶端所有消息已經(jīng)發(fā)送。當(dāng)所有要返回的內(nèi)容發(fā)送完畢時(shí),該函數(shù)必須要被調(diào)用一次。如果不調(diào)用該函數(shù),那么客戶端將會(huì)永遠(yuǎn)處于等待狀態(tài)。
使用方法:
response.end([data], [encoding])
data end()執(zhí)行完畢后要輸出的字符,如果指定了 data 的值,那就意味著在執(zhí)行完 response.end() 之后,會(huì)接著執(zhí)行一條 response.write(data , encoding);
encoding 對(duì)應(yīng)data的字符編碼
以上所述是小編給大家介紹的使用node.js搭建服務(wù)器的方法,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例
這篇文章主要介紹了nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法
Redis數(shù)據(jù)庫采用極簡(jiǎn)的設(shè)計(jì)思想,最新版的源碼包還不到2Mb。其在使用上也有別于一般的數(shù)據(jù)庫。下面這篇文章就來給大家介紹了node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例
這篇文章主要介紹了詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05nodejs中用npm初始化來創(chuàng)建package.json的實(shí)例講解
今天小編就為大家分享一篇nodejs中用npm初始化來創(chuàng)建package.json的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10詳解Express筆記之動(dòng)態(tài)渲染HTML(新手入坑)
這篇文章主要介紹了詳解Express筆記之動(dòng)態(tài)渲染HTML(新手入坑),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12詳解使用Visual Studio Code對(duì)Node.js進(jìn)行斷點(diǎn)調(diào)試
這篇文章主要介紹了詳解使用Visual Studio Code對(duì)Node.js進(jìn)行斷點(diǎn)調(diào)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09