IT兄弟會全棧工程師精英班第四天(學習筆記)

搭建靜態資源服務器之node HTTP模塊

  • 1. 代碼如下:
    const http  = require('http');
    const ip    = '192.168.1.108';
    const port  = 3608;
    
    http.createServer((req,res)=>{
        res.writeHead(200,{'Content-Type':'text/html'});
        res.write("<html>");
        res.write("<head>");
        res.write("</head>");
        res.write("<body>");
        res.write("<h1>hello nodejs world!</h1>");
        res.write("</body>");
        res.write("</html>");
        res.end();
    }).listen(port,ip,()=>{
        console.log('server start');
    });
    
    • 先在linux輸入命令
      root@tecmint:~# node app.js
      
      顯示
      server start //表示已經啟動服務
      
    • 在瀏覽器中輸入ip地址
      192.168.1.108:3608 //顯示相對應的信息
      
  • 封裝成函數
    • 代碼如下:
    const http  = require('http');
    const ip    = '192.168.2.108';
    const port  = 3608;
    var fn = function(req,res){
        res.writeHead(200,{'Content-Type': 'text/html'});
        res.write("<html>");
        res.write("<head>");
        res.write("</head>");
        res.write("<body>");
        res.write("<h1>hello nodejs world!</h1>");
        res.write("</body>");
        res.write("</html>");
        res.end();
    }
    
    var fs = function(){
        console.log('server start');
    }
    
    http.createServer(fn).listen(port,ip,fs);
    

搭建靜態資源服務器之node URL模塊

  • url.parse(urlStr[, parseQueryString][, slashesDenoteHost]);
    • 說明: 將一個URL字符串轉換成對象并返回
    • 參數:
      • urlStr 表示url字符串
      • parseQueryString 為true時將使用查詢模塊分析查詢字符串,默認為false
      • slashesDenoteHost
        默認為false,//foo/bar 形式的字符串將被解釋成 { pathname: ‘//foo/bar' }
        如果設置成true,//foo/bar 形式的字符串將被解釋成 { host: ‘foo', pathname: ‘/bar' }
    • 代碼如下:
    const http  = require('http');
    const url   = require('url');
    const ip    = '192.168.2.108';
    const port  = 3608;
    var fn = function(req,res){
        var pathname = url.parse(req.url).pathname;
        res.write(pathname);
        res.end();
    }
    
    var fs = function(){
        console.log('server start');
    }
    
    http.createServer(fn).listen(port,ip,fs);
    

搭建靜態資源服務器之node fs模塊

  • Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內容的函數有異步的 fs.readFile() 和同步的 fs.readFileSync()。

    異步的方法函數最后一個參數為回調函數,回調函數的第一個參數包含了錯誤信息(error)。

    建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞。

  • fs.readFile(file[, options], callback);

    • 說明:
      • 異步讀取文件。其中file可以為文件名或文件路徑,options可以為對象或字符串。包括讀取文件時的編碼、文件的讀取方式(默認為‘r’);
      • fs.readFile(文件名,編碼,回調函數(err,data));
    • 代碼如下:
    var fs = require("fs");
    
    // 異步讀取
    fs.readFile('input.txt', function (err, data) {
       if (err) {
           return console.error(err);
       }
       console.log("異步讀取: " + data.toString());
    });
    
    // 同步讀取
    var data = fs.readFileSync('input.txt');
    console.log("同步讀取: " + data.toString());
    
    console.log("程序執行完畢。");
    

nodejs文件操作模塊FS(File System)常用函數簡明總結

  • 件系統操作相關的函數挺多的。首先可以分為兩大類。

  • 一類是異步+回調的。 一類是同步的。

  • 在這里只對異步的進行整理,同步的只需要在函數名稱后面加上Sync即可

  • 1.1 首先是一類最常規的讀寫函數,函數名稱和形式,應該是起源于C語言的。

    • fs.open(path, flags[, mode], callback);

      • 說明:異步模式下打開文件
      • fs.open(文件路徑,讀寫標識,[文件mode值,666],回調函數(err,文件句柄fd));
      • 參數:
        • path - 文件的路徑。
        • flags - 文件打開的行為。具體值詳見下文。
        • mode - 設置文件模式(權限),文件創建默認權限為 0666(可讀,可寫)。
        • callback - 回調函數,帶有兩個參數如:callback(err, fd)。
      • 實例:
        var fs = require("fs");
        // 異步打開文件
        console.log("準備打開文件!");
        fs.open('input.txt', 'r+', function(err, fd) {
           if (err) {
               return console.error(err);
           }
          console.log("文件打開成功!");
        });
        
        以上代碼執行結果如下:
        $ node file.js
        準備打開文件!
        文件打開成功!
        
    • fs.read(fd, buffer, offset, length, position, callback);

      • 說明:異步模式下讀取文件

      • fs.read(文件句柄fd,被寫入的buffer,offset,length,position,回調函數(err, bytesRead, buffer));

      • 參數 :

        • fd - 通過 fs.open() 方法返回的文件描述符。
        • buffer - 數據寫入的緩沖區。
        • offset - 緩沖區寫入的寫入偏移量。
        • length - 要從文件中讀取的字節數。
        • position - 文件讀取的起始位置,如果 position 的值為 null,則會從當前文件指針的位置讀取。
        • callback - 回調函數,有三個參數err, bytesRead, buffer,err 為錯誤信息, bytesRead 表示讀取的字節數,buffer 為緩沖區對象。

        其功能為從指定的文件描述符 fd 中讀取數據并寫入 buffer 指向的緩沖區對象。offset 是buffer 的寫入偏移量。length 是要從文件中讀取的字節數。position 是文件讀取的起始位置,如果 position 的值為 null,則會從當前文件指針的位置讀取。回調函數傳遞bytesRead 和 buffer,分別表示讀取的字節數和緩沖區對象。
        - 實例:
        ```
        var fs = require("fs");
        var buf = new Buffer(1024);

        console.log("準備打開已存在的文件!");
        fs.open('input.txt', 'r+', function(err, fd) {
        if (err) {
        return console.error(err);
        }
        console.log("文件打開成功!");
        console.log("準備讀取文件:");
        fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
        if (err){
        console.log(err);
        }
        console.log(bytes + " 字節被讀取");

            // 僅輸出讀取的字節
            if(bytes > 0){
               console.log(buf.slice(0, bytes).toString());
            }
         });
        

        });

        以上代碼執行結果如下:
        

        $ node file.js
        準備打開已存在的文件!
        文件打開成功!
        準備讀取文件:
        42 字節被讀取
        百度:www.baidu.com

    • fs.write(文件句柄fd,被讀取的buffer,offset,length,position,回調函數(err,bytesWritten,buffer));

      功能為將buffer內容寫入fd中。
      + fs.close(文件句柄,回調函數);
      + fs.truncate(文件句柄,截斷長度,回調函數);
      + fs.fsync(文件句柄,回調函數);

    • 未完待續;

構建一個靜態資源的服務器,根據不同的url地址請求不同的文件(模板)

  • 實例:
    //加載http服務api模塊
    var http = require('http');
    var ip   = '192.168.1.108';
    //加載fs文件服務api模塊
    var fs   = require('fs');
    //創建新的HTTP服務器
    var server = new http.Server();
    //創建url路由api模塊
    var urlpai = require('url');
    //監聽端口
    server.listen(3068,ip);
    
    //使用on方法注冊事件處理,該事件一直被監聽。任何的請求都會進入回調函數,執行相應的操作
    server.on("request",function(request,response){//當有request請求的時候觸發處理函數
        //解析請求url
        var url = urlpai.parse(request.url);
    
        //監聽請求的網站,以當前腳本目錄為根目錄的url地址
        //console.log(url.pathname);
    
        //特殊url會讓服務器在發送響應前先等待
        switch(url.pathname){
            case '' || '/'://處理請求的網站根目錄,指定加載對應的文件夾,一般以根目錄的index.html為默認,node.js是高效流處理的方案,也可以通過配置文件來配置
                fs.readFile("./index.html",function(err,data){//打開請求文件
                    if(err){    //輸入錯誤信息,也可以自定義錯誤信息
                        response.writeHead(404,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{  //請求成功返回數據
                        response.writeHead(200,{'Content-Type':'text/html;charset="UTF-8"'});  //告訴響應頭文件,返回數據的類型
                        response.write(data);//返回的內容,有時候還會加上buter數據類型
                        response.end();//結束相應,不寫的話。會一直處于相應狀態,頁面不會顯示內容
                    }
                });
                break;
            case '/list':   //顯示商品列表頁
                fs.readFile("./list.html",function(err,data){
                    if(err){
                        response.writeHead(400.{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200,'Content-Type':'text/html;charset="UTF-8"');
                        response.write(data);
                        response.end();
                    }
                });
                break;
            case '/detail': //商品詳情頁
                fs.readFile("./detail.html",function(err,data){
                    if(err){
                        response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200.{'Content-Type':'text/html;charset="UTF-8"'});
                        response.write(data);
                        response.end();
                    }
                });
                break;
            default:    //處理來自本地目錄的文件,主要是一些靜態資源文件,搭建靜態服務器還有其他方法
                var fileName = url.pathname.substring(1);   //去掉前導'/'
                var types    = getType(fileName.substring(fileName.lastIndexOf('.')+1));
                console.log(fileName);  //取得文件類型 css  js  ....
                //異步讀取文件,并將內容作為單獨的數據模塊傳給回調函數
                //對于確實很大的文件,使用流API fs.createReadStream()更好
                fs.readFile(fileName,function(err,data) {
                    if(err){
                        response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200,{'Content-Type':types});
                        response.write(data);
                        response.end();
                    }
                });
                break;
        }
    });
    
    //判斷文件類型的函數
    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 'txt':
                type = 'text/plain;charset=UTF-8';
                break;
            case 'css':
                type = 'text/css;charset=UTF-8';
                break;
            case 'js':
                type = 'application/javascript;charset=UTF-8';
                break;
            case 'manifest':
                type = 'text/cache-manifest;charset=UTF-8';
                break;
            default:
                type = 'application/octet-stream';
        }
        return type;
    }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容