利用 HTTP 模塊 URl 模塊 PATH 模塊 FS 模塊建立一個 WEB 服務器 (6)

1Node.js 建立的第一個應用

//用 http 模塊建立服務
http.createServer(function(req,res){
// 發送 HTTP 頭部
// HTTP 狀態值: 200 : OK
//設置 HTTP 頭部,狀態碼是 200,文件類型是 html,字符集是 utf-8
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
res.write('你好 nodejs');
res.write('我是第一個 nodejs 程序');
res.end(); /*結束響應*/
}).listen(8001);

 

2WEB 服務器介紹

  Web 服務器通常指網站服務器,是指駐留於因特網上某種類型計算機的程序,能夠向瀏覽
器等 Web 客戶端提供文檔, 也能夠放置網站文件,讓全世界瀏覽;能夠放置數據文件,讓
全世界下載。目前最主流的三個 Web 服務器是 Apache Nginx IIS
javascript

 

3 建立一個簡單的web服務器

目錄結構css

 

 `01 services1.js`代碼html

// 引入模塊
var http = require('http');

// fs 模塊
var fs =require('fs');

http.createServer(function (req, res) {
    //http://localhost:8001/news.html  /news.html
    //http://localhost:8001/index.html  /index.html
    //css/dmb.bottom.css

    var pathname =req.url;
    //路由分發
    if (pathname==='/'){
        pathname ='/index.html';
    }
    if (pathname!=='/favicon.ico'){
     console.log(pathname);
    fs.readFile('static'+pathname,function (err, data) {
        if (err){
            console.log('404');
        }else{
            res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"})
            res.write(data);
            res.end()
        }
    })
}
    console.log(pathname);
}).listen(8001);

 

4 調用解析後綴名的方法,構建content-type

`02 services2.js`java

// 引入模塊
var http = require('http');

// fs 模塊
var fs =require('fs');

// path模塊
var path = require('path');

// 自定義模塊
var mimeModel =require('./model/getmime.js');

http.createServer(function (req, res) {
    //http://localhost:8001/news.html  /news.html
    //http://localhost:8001/index.html  /index.html
    //css/dmb.bottom.css

    var pathname =req.url;
    //路由分發
    if (pathname==='/'){
        pathname ='/index.html';
    }

    // 獲取後綴名
    var extname = path.extname(pathname);

    if (pathname!=='/favicon.ico'){ /*過濾請求 favicon.ico*/
        //console.log(pathname);
        //文件操做獲取 static 目錄下的 index.html  文件
        fs.readFile('static'+pathname,function (err, data) {
            if (err){
                console.log('404');
                fs.readFile('static/404.html',function (err, data404) {
                    if (err){
                        console.log(err);
                    }
                    res.writeHead('404',{"Content-Type":"text/html;charset='utf-8'"});
                    res.write(data404);
                    res.end()
                })
            }else{//返回文件
                // 獲取文件類型
                var mine = mimeModel.getMime(extname);
                res.writeHead(200,{"Content-Type":mine+";charset='utf-8'"});
                res.write(data);
                res.end()
            }
        })
    }
    console.log(pathname);
}).listen(8001);

 

`model/getmime.js`node

/**
 * Created by Administrator on 2017/7/2 0002.
 */
exports.getMime=function (extname) { /*獲取後綴名*/
    switch (extname) {
        case '.html':
            return 'text/html';
        case '.css':
            return 'text/css';
        case '.js':
            return 'text/javascript';
        default:
            return 'text/html';
    }
};

 

5 讀取文件屬於異步執行過程,解說以下

getmimefromfile.js文件代碼web

 

exports.getMine = function (fs, extname) {
    //.html
    console.log('1');
    fs.readFile('mime.json',function (err, data) {
        console.log('fs.readFile:','2');
        if (err){
            console.log('../mine.josn文件不存在');
            console.log(err);
            return false
        }
        var Mines = JSON.parse(data.toString());
        return Mines[extname] || 'text/html' //默認返回'text/html'
    });
    console.log('3')
};

 

 

03 services.js 代碼json

// fs 模塊
var fs =require('fs');
​
// path模塊
var path = require('path');
​
// 自定義模塊
var mimeModel =require('./model/getmimefromfile.js');
​
console.log("mimeModel.getMine(fs, '.html'):",mimeModel.getMine(fs, '.html'));

 

 

執行結果服務器

 

 

 

緣由分析:異步

1 fs.readFile 屬於異步方法,顧程序執行到 fs.readFile ,不等待執行結果,就直接往下執行,最後返回undefiled.網站

 

解決辦法: fs.readFile 改爲 fs.readFileSync

 

exports.getMine = function (fs, extname) {
    //.html
    //把讀取數據改爲同步
    var data = fs.readFileSync('mime.json');
    //data.toString() 轉換成json字符串
    var Mimes = JSON.parse(data.toString()); /*把json字符串轉換成json對象*/
    return Mimes[extname] || 'text/html';
};

 

 6 使用文件動態構建 content-type

`04.services4.js`

// 引入模塊
var http = require('http');

// fs 模塊
var fs =require('fs');

// path模塊
var path = require('path');

// url 模塊
var url = require('url');

// 自定義模塊
var mimeModel =require('./model/getmimefromfile.js');

http.createServer(function (req, res) {
    //http://localhost:8001/news.html  /news.html
    //http://localhost:8001/index.html  /index.html
    //css/dmb.bottom.css
    
    // 只獲取路徑,不攜帶參數
    var pathname =url.parse(req.url).pathname;
    //路由分發
    if (pathname==='/'){
        pathname ='/index.html';
    }

    // 獲取後綴名
    var extname = path.extname(pathname);

    if (pathname!=='/favicon.ico'){ /*過濾請求 favicon.ico*/
        //console.log(pathname);
        //文件操做獲取 static 目錄下的 index.html  文件
        fs.readFile('static'+pathname,function (err, data) {
            if (err){
                console.log('404');
                fs.readFile('static/404.html',function (err, data404) {
                    if (err){
                        console.log(err);
                    }
                    res.writeHead('404',{"Content-Type":"text/html;charset='utf-8'"});
                    res.write(data404);
                    res.end()
                })
            }else{//返回文件
                // 獲取文件類型
                var mine = mimeModel.getMine(fs,extname);
                res.writeHead(200,{"Content-Type":mine+";charset='utf-8'"});
                res.write(data);
                res.end()
            }
        })
    }
    console.log(pathname);
}).listen(8001);

 

`model/getmimefromfile.js`

exports.getMine = function (fs, extname) {
    //.html
    //把讀取數據改爲同步
    var data = fs.readFileSync('./mime.json');
    //data.toString() 轉換成json字符串
    var Mimes = JSON.parse(data.toString()); /*把json字符串轉換成json對象*/
    return Mimes[extname] || 'text/html';
};
相關文章
相關標籤/搜索