1. 程式人生 > >nodejs學習重點之http模組

nodejs學習重點之http模組

http 模組

封裝了http server 和 client的功能,就是說可以充當server處理請求,也可以發出請求。

  • http.createServer:建立server物件

  • http.get:執行http get請求

 const http = require('http')
  ​
  const server = http.createServer((req, res)=>{
     // console.log(`url: ${req.url}  method: ${req.method}`)
  ​
      // res.writeHead(200, {'Content-Type':'text/plain;charset=utf-8'})
      // res.end('收到了請求')
      router(req, res)
  });
  // 執行get請求
  // http.get("http://www.baidu.com", (res)=>{
  //     // console.log(res);
  //     res.setEncoding('utf-8')
  //
  //     let data = ''
  //     res.on('data', (chunk)=>{
  //         data += chunk
  //     })
  //     res.on('end', ()=>{
  //         console.log(data);
  //     })
  // })

【案例】檔案瀏覽伺服器

功能需求:啟動一個服務,當用戶訪問服務時,給使用者展示指定目錄下的所有檔案;如果子檔案是目錄,則能繼續點進去瀏覽。http://127.0.0.1:5000/ 寫完後訪問這個網站5000是可變的, 最好不要指定1000以下的埠, 因為有可能系統已經佔用了

let http = require("http");
let fs = require('fs');
//5
let path = require('path');


// 1.啟動一個伺服器
let server = http.createServer( (req, res)=>{
    //過濾掉/favicon.ico, 否則每次執行都會列印它
    if(req.url === '/favicon.ico'){
        res.end("")
        return
    }
    // console.log(req.url);
    //1.3 使的瀏覽器可以識別html標籤  使用utf-8  不然瀏覽器預設會使用GBK(中國特用規範)
    res.writeHead(200, {'content-type': 'text/html;charset=utf-8'})
    showDir(req, res)//1.2 創一個物件

});
//1.啟動伺服器 
server.listen(5000);
//1.2 實現物件的方法
function showDir(req, res) {
    // 預設是/,讀取test目錄下面的
    let target = 'test';
    if(req.url !== '/'){
        // 如果不是/根路徑,說明是請求了其他路徑
        target = req.url;
    }

    //2. 讀取目標目錄下的檔案列表
    let s = target.substring(target.indexOf("/")+1);
    console.log(s);
    fs.readdir(s, (err, files)=>{
        // res.end(JSON.stringify(files)) 這是用json顯示檔案內容
        
        //4. 遍歷一下  li標籤較多  給一個字串拼接起來
        let listr = '';
        files.forEach( f=>{
            //5. 用target檔名拼的一個叫fpath的路徑
            let fpath = path.join("./", target, f);
            console.log(fpath);
            //用了同步程式碼
            let stat = fs.statSync(fpath);
            if(stat.isDirectory()){
                //4. 應該拼上a標籤
                // console.log(fpath);
                //4. 這裡要換成f的那個檔名
                listr += `<li><a href="${fpath}">${f}</a></li>`
            }else {
                //不拼a標籤
                listr += `<li>${f}</li>`
            }

        });

        res.end(makeHtml(listr))
    })
}

//3. 顯示這些文字標籤
function makeHtml(lis) {
    return `<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>標題</title>
    <style type="text/css">
        *{padding: 0; margin: 0}
        ul>li{
            list-style: none;
        }
        
        li{
            padding: .6rem 1rem;
            background-color:#ddd;
            transition: all 1s;
        }
        li:not(:first-child){
             border-top: solid 1px #999;
        }
        li:hover{
            background-color:#aaa;
        }
    </style>
</head>
<body>
<div>
    <ul>
        ${lis}
    </ul>
</div>
</body>
</html>`
}