天天看點

二十、Node.js- WEB 伺服器 (三)靜态檔案托管、 路 由

1、Nodejs 靜态檔案托管

上一講的靜态 web 伺服器封裝

項目結構:

二十、Node.js- WEB 伺服器 (三)靜态檔案托管、 路 由

Web伺服器封裝成的子產品:router.js代碼:

var http=require('http');
var fs=require('fs');
var path=require('path');  /*nodejs自帶的子產品*/
var url=require('url');
//引入events子產品解決無法擷取異步資料問題
var events=require("events");
var  EventEmitter=new events.EventEmitter();
module.exports = {
    statics: function (req, res,staticpath) {
        var pathname = url.parse(req.url).pathname;/*擷取url傳值*/
        if (pathname == '/') {
            pathname = '/index.html'; /*預設加載的首頁*/
        }
        //擷取檔案的字尾名
        var extname = path.extname(pathname);
        if (pathname != '/favicon.ico') {  /*過濾請求favicon.ico*/
            //檔案操作擷取 static下面的檔案
            fs.readFile(staticpath+'/' + pathname, function (err, data) {
                if (err) {  /*麼有這個檔案*/
                    console.log('404');
                    fs.readFile(staticpath+'/404.html', function (error, data404) {
                        if (error) {
                            console.log(error);
                        }
                        res.writeHead(404, {"Content-Type": "text/html;charset='utf-8'"});
                        res.write(data404);
                        res.end(); /*結束響應*/
                    })
                } else { /*傳回這個檔案*/
                    getMime(extname, EventEmitter)  /*擷取檔案類型*/
                    EventEmitter.on("msg", function (text) {
                        res.writeHead(200, {"Content-Type": "" + text + ";charset='utf-8'"});
                        //res.write(data);注意,在接收廣播的回調函數裡面不能使用write了,否則會報錯:write after end
                        res.end(data); /*結束響應*/
                    })
                }
            })
        }
    }
}


//擷取檔案類型的方法,  私有
function getMime(etxName,EventEmitter) {
    fs.readFile("./mime.json",function (err,data) {
        if (err){
            console.log('mime.json檔案不存在');
        }else {
            //console.log(data.toString());//将十六進制轉換為字元串
            var  mimes=JSON.parse(data.toString());//将json字元串轉換為json對象
            EventEmitter.emit("msg",mimes[etxName]||"text/html")//廣播對應的頭檔案資訊,如果沒有的話就傳回text/html
        }
    })
}      

建立伺服器的00service01.js的代碼:

var http=require('http');
var fs=require('fs');
var  router=require("./model/router")

http.createServer(function (req,res) {//注意req,res不要寫反

    router.statics(req,res,"static")

}).listen(8002)      

2、路由

官方解釋:

路由(Routing)是由一個 URI(或者叫路徑)和一個特定的 HTTP 方法的,涉及到應用如何響應用戶端對某個網站節點的通路。

非官方解釋:

路由指的就是針對不同請求的 URL,處理不同的業務邏輯。

二十、Node.js- WEB 伺服器 (三)靜态檔案托管、 路 由

 路由代碼參考:

var http = require("http")
var url = require("url")
http.createServer(function (req, res) {
    var allUrl = req.url;
    var path = url.parse(allUrl).pathname;
    if (path == "/login") {
        res.end("login")
    } else if (path == "/register") {
        res.end("register")
    } else if (path == "/admin") {
        res.end("admin")
    }
})      

轉載于:https://www.cnblogs.com/luzhanshi/p/10768920.html