搭建簡單的nodejs服務(wù)器

搭建簡單的nodejs服務(wù)器

通過一些簡單配置我們就可以搭建一臺基于nodejs的http服務(wù)器

通過switch配置url路由的方法

// 這是一個簡單的Node HTTP服務(wù)器,能處理當(dāng)前目錄的文件
// 并能實現(xiàn)兩種特殊的URL用于測試
// 用HTTP://localhost:8000或http://127.0.0.1:8000連接這個服務(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方法注冊事件處理,該事件一直被監(jiān)聽,任何的請求都會進(jìn)入回調(diào)函數(shù),執(zhí)行相應(yīng)的操作
server.on('request', function(request, response) { // 當(dāng)有request請求的時候觸發(fā)處理函數(shù)    
    // 解析請求的URL
    var url = urlapi.parse(request.url);
    
    //監(jiān)聽請求的網(wǎng)站,以當(dāng)前腳本目錄為根目錄的url地址
    console.log(url.pathname);
    
    // 特殊URL會讓服務(wù)器在發(fā)送響應(yīng)前先等待
    switch(url.pathname) {    //判斷請求的路徑信息
    case ''||'/' : // 處理請求的網(wǎng)站根目錄,指定加載對應(yīng)的文件夾,一般以根目錄的index.html為默認(rèn),nodejs是高效流處理的方案,也可以通過配置文件來配置
        fs.readFile("./page/index.html", function(err, content){  //打開請求的文件
            if(err) {  //輸出錯誤信息,也可以自定義錯誤信息
                response.writeHead(404, { 'Content-Type':'text/plain; charset="UTF-8"' });
                response.write(err.message);
                response.end();
            } else {  //請求成功返回數(shù)據(jù)
                response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' });  //告訴相應(yīng)頭文件,返回數(shù)據(jù)的類型
                response.write(content); //返回的內(nèi)容,有時候還會加上buter數(shù)據(jù)類型
                response.end();  //結(jié)束響應(yīng),不寫的話,會一直處于響應(yīng)狀態(tài),頁面不會顯示內(nèi)容
            }
        });
        break;
    case '/test/delay':// 此處用于模擬緩慢的網(wǎng)絡(luò)連接
        // 使用查詢字符串來獲取延遲時長,或者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)用的另一個函數(shù)中完成響應(yīng)
        setTimeout(function(){
            response.write('done.');
            response.end();
        }, delay);
        break;

    case '/test/mirror':// 如果請求是test/mirror,則原文返回它
        // 響應(yīng)狀態(tài)和頭
        response.writeHead(200, {'Content-type':'text/plain; charset=UTF-8'});
        // 用請求的內(nèi)容開始編寫響應(yīng)主體
        response.write(request.mothod + ' ' + request.url + ' HTTP/' + request.httpVersion + '\r\n');
        // 所有的請求頭
        for (var h in request.headers) {
            response.write(h + ':' + request.headers[h] + '\r\n');
        }
        response.write('\r\n');// 使用額外的空白行來結(jié)束頭
        // 在這些事件處理程序函數(shù)中完成響應(yīng)
        // 當(dāng)請求主體的數(shù)據(jù)塊完成時,把其寫入響應(yīng)中
        request.on('data', function(chunk) { response.write(chunk); });
        // 當(dāng)請求結(jié)束時,響應(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)容作為單獨的數(shù)據(jù)模塊傳給回調(diào)函數(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;
    }     
});

//這里定義了一個用來判斷文件類型的函數(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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,290評論 6 342
  • 試衣間走紅,誰在炒作誰在搭車?火了誰傷了誰? 這兩天,優(yōu)X庫試衣間不雅視頻、圖片、段子,串紅朋友圈、微博、QQ空間...
    余忘江湖閱讀 249評論 0 2

友情鏈接更多精彩內(nèi)容