搭建簡(jiǎn)單的nodejs http服務(wù)器詳解
搭建簡(jiǎn)單的nodejs服務(wù)器
通過一些簡(jiǎn)單配置我們就可以搭建一臺(tái)基于nodejs的http服務(wù)器
通過switch配置url路由的方法
// 這是一個(gè)簡(jiǎn)單的Node HTTP服務(wù)器,能處理當(dāng)前目錄的文件
// 并能實(shí)現(xiàn)兩種特殊的URL用于測(cè)試
// 用HTTP://localhost:8000或http://127.0.0.1:8000連接這個(gè)服務(wù)器
// 首先加載所有需要用到的模塊
var http = require('http'); // 加載http服務(wù)api模塊
var fs = require('fs'); // 加載fs文件服務(wù)api模塊
var server = new http.Server(); // 創(chuàng)建新的HTTP服務(wù)器
var urlapi = require('url'); // 創(chuàng)建url路由api模塊
server.listen(8000); // 監(jiān)聽端口8000
// 使用on方法注冊(cè)事件處理,該事件一直被監(jiān)聽,任何的請(qǐng)求都會(huì)進(jìn)入回調(diào)函數(shù),執(zhí)行相應(yīng)的操作
server.on('request', function(request, response) { // 當(dāng)有request請(qǐng)求的時(shí)候觸發(fā)處理函數(shù)
// 解析請(qǐng)求的URL
var url = urlapi.parse(request.url);
//監(jiān)聽請(qǐng)求的網(wǎng)站,以當(dāng)前腳本目錄為根目錄的url地址
console.log(url.pathname);
// 特殊URL會(huì)讓服務(wù)器在發(fā)送響應(yīng)前先等待
switch(url.pathname) { //判斷請(qǐng)求的路徑信息
case ''||'/' : // 處理請(qǐng)求的網(wǎng)站根目錄,指定加載對(duì)應(yīng)的文件夾,一般以根目錄的index.html為默認(rèn),nodejs是高效流處理的方案,也可以通過配置文件來配置
fs.readFile("./page/index.html", function(err, content){ //打開請(qǐng)求的文件
if(err) { //輸出錯(cuò)誤信息,也可以自定義錯(cuò)誤信息
response.writeHead(404, { 'Content-Type':'text/plain; charset="UTF-8"' });
response.write(err.message);
response.end();
} else { //請(qǐng)求成功返回?cái)?shù)據(jù)
response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' }); //告訴相應(yīng)頭文件,返回?cái)?shù)據(jù)的類型
response.write(content); //返回的內(nèi)容,有時(shí)候還會(huì)加上buter數(shù)據(jù)類型
response.end(); //結(jié)束響應(yīng),不寫的話,會(huì)一直處于響應(yīng)狀態(tài),頁(yè)面不會(huì)顯示內(nèi)容
}
});
break;
case '/test/delay':// 此處用于模擬緩慢的網(wǎng)絡(luò)連接
// 使用查詢字符串來獲取延遲時(shí)長(zhǎng),或者2000毫秒
var delay = parseInt(url.query) || 2000;
// 設(shè)置響應(yīng)狀態(tài)和頭
response.writeHead(200, {'Content-type':'text/plain; charset=UTF-8'});
// 立即開始編寫響應(yīng)主體
response.write('Sleeping for' + delay + ' milliseconds...');
// 在之后調(diào)用的另一個(gè)函數(shù)中完成響應(yīng)
setTimeout(function(){
response.write('done.');
response.end();
}, delay);
break;
case '/test/mirror':// 如果請(qǐng)求是test/mirror,則原文返回它
// 響應(yīng)狀態(tài)和頭
response.writeHead(200, {'Content-type':'text/plain; charset=UTF-8'});
// 用請(qǐng)求的內(nèi)容開始編寫響應(yīng)主體
response.write(request.mothod + ' ' + request.url + ' HTTP/' + request.httpVersion + '\r\n');
// 所有的請(qǐng)求頭
for (var h in request.headers) {
response.write(h + ':' + request.headers[h] + '\r\n');
}
response.write('\r\n');// 使用額外的空白行來結(jié)束頭
// 在這些事件處理程序函數(shù)中完成響應(yīng)
// 當(dāng)請(qǐng)求主體的數(shù)據(jù)塊完成時(shí),把其寫入響應(yīng)中
request.on('data', function(chunk) { response.write(chunk); });
// 當(dāng)請(qǐng)求結(jié)束時(shí),響應(yīng)也完成
request.on('end', function(chunk){ response.end(); });
break;
case '/json' : // 模擬JSON數(shù)據(jù)返回
// 響應(yīng)狀態(tài)和頭
response.writeHead(200, {'Content-type':'application/json; charset=UTF-8'});
response.write(JSON.stringify({test:'success'}));
response.end();
break;
default:// 處理來自本地目錄的文件,主要是一些靜態(tài)資源文件,搭建靜態(tài)服務(wù)器還有其他的方法
var filename = url.pathname.substring(1); // 去掉前導(dǎo)'/'
var type = getType(filename.substring(filename.lastIndexOf('.')+1));
console.log(filename); //取得文件類型 css js ....
// 異步讀取文件,并將內(nèi)容作為單獨(dú)的數(shù)據(jù)模塊傳給回調(diào)函數(shù)
// 對(duì)于確實(shí)很大的文件,使用流API fs.createReadStream()更好
fs.readFile(filename, function(err, content){
if(err) {
response.writeHead(404, { 'Content-Type':'text/plain; charset="UTF-8"' });
response.write(err.message);
response.end();
} else {
response.writeHead(200, { 'Content-Type' : type });
response.write(content);
response.end();
}
});
break;
}
});
//這里定義了一個(gè)用來判斷文件類型的函數(shù)
function getType(endTag){
var type=null;
switch(endTag){
case 'html' :
type = 'text/html; charset=UTF-8';
break;
case 'htm' :
type = 'text/html; charset=UTF-8';
break;
case 'js' :
type = 'application/javascript; charset="UTF-8"';
break;
case 'css' :
type = 'text/css; charset="UTF-8"';
break;
case 'txt' :
type = 'text/plain; charset="UTF-8"';
break;
case 'manifest' :
type = 'text/cache-manifest; charset="UTF-8"';
break;
default :
type = 'application/octet-stream';
break;
}
return type;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
npm?install安裝失敗報(bào)錯(cuò):The?operation?was?rejected?by?your?
這篇文章主要給大家介紹了關(guān)于npm?install安裝失敗報(bào)錯(cuò):The?operation?was?rejected?by?your?operating?system的相關(guān)資料,文中給出了多種解決方法供大家參考學(xué)習(xí),需要的朋友可以參考下2023-04-04
node.js中fs文件系統(tǒng)目錄操作與文件信息操作
本篇文章給大家詳細(xì)分析了node.js中fs文件系統(tǒng)目錄操作與文件信息操作的方法以及代碼詳解,需要的讀者可以參考下。2018-02-02
koa2上傳文件及https配置實(shí)現(xiàn)教程
這篇文章主要為大家介紹了koa2上傳文件及https配置實(shí)現(xiàn)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
node.js使用express框架進(jìn)行文件上傳詳解
在本篇內(nèi)容里小編給大家整理了關(guān)于node.js使用express框架進(jìn)行文件上傳的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2019-03-03
Node.js五大應(yīng)用性能技巧小結(jié)(必須收藏)
本篇文章主要介紹了Node.js五大應(yīng)用性能技巧小結(jié)(必須收藏),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家2017-08-08
node實(shí)現(xiàn)登錄圖片驗(yàn)證碼的示例代碼
這篇文章主要介紹了node實(shí)現(xiàn)登錄圖片驗(yàn)證碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
nodejs對(duì)mongodb數(shù)據(jù)庫(kù)的增加修刪該查實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于nodejs對(duì)mongodb數(shù)據(jù)庫(kù)的增加修刪該查實(shí)例代碼,有需要的朋友們可以參考下。2020-01-01
5分鐘教你用nodeJS手寫一個(gè)mock數(shù)據(jù)服務(wù)器的方法
這篇文章主要介紹了5分鐘教你用nodeJS手寫一個(gè)mock數(shù)據(jù)服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
nodejs連接mysql數(shù)據(jù)庫(kù)簡(jiǎn)單封裝示例-mysql模塊
本篇文章主要介紹了nodejs連接mysql數(shù)據(jù)庫(kù)簡(jiǎn)單封裝(mysql模塊),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04

