3.原生nodejs开启静态服务

打造类似apache/iis/Nginx的静态资源服务器

目录结构如下:
images

要做的效果如下:
在这里插入图片描述

//server.js
var http=require('http');
var fs=require('fs');
var path=require('path');   //path.extname()方法可以拿到后缀名
var url=require('url');   //url.parse()可以解析路径 不含?后面参数
var mime=require('./www/getMime.js');//加载外部模块
http.createServer(function(req,res){
    var pathName=url.parse(req.url).pathname;
    if(pathName=='/'){
        pathName='/index.html'
    }                     //处理掉图标ico
    if(pathName!='/favicon.ico'){     //过滤掉图标
        var extName=path.extname(pathName);  //拿到后缀名   .html   .css  .jpg....
        fs.readFile('www'+pathName,function(err,data){
            if(err){    
            //找不到文件,跳转到404页面
                fs.readFile("www/404.html",function(error,data404) {
                    res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
                    res.write(data404);
                    res.end();
                    return;
                })
            }else {
            //找的到页面,去解析..
                var mimeName= mime.getMimes(extName);
                console.log(mimeName);
                res.writeHead(200,{"Content-Type":mimeName+";charset='utf-8'"});
                res.write(data);
                res.end();
            }
        });
    }
}).listen(8081);
//getMime.js 
exports.getMimes=function(extName){
    switch (extName){
        case '.html':
            return 'text/html';
        case '.css':
            return 'text/css';
        case '.js':
            return 'text/javascript';
        case '.jpeg':
            return 'image/jpeg';
         default:
         	return 'text/html'
    }
}

但是往往Content-Type的类型很多几百种
在这里插入图片描述
思路:我们需要把文件mime.json里面的数据读出来,使其变成Object类型,根据传过来的后缀名,匹配对应的编码方式,就大功告成!~

//getMime.js 改写成这样!~     XXXXXX写法
exports.getMimes=function (fs,extName) {
        fs.readFile('./www/mime.json',function(err,data){
        if(err){
            console.log(err)
        }else{
            var mime=JSON.parse(data.toString());
            console.log(mime);   //可以打出mime
           return mime[extName];   // 异步导致返回值是undefined
        }
    })
};
//1.将异步读文件写成同步  
exports.getMimes=function (fs,extName) {
       /* fs.readFile('./www/mime.json',function(err,data){
        if(err){
            console.log(err)
        }else{
            var mime=JSON.parse(data.toString());
            console.log(mime);
           return mime[extName];
        }
    })*/
       var mimes=fs.readFileSync('./www/mime.json');
       var mime=JSON.parse(mimes.toString());
       return mime[extName];
};
//2.异步callback的写法
exports.getMimes=function (fs,extName,callback) {
        fs.readFile('./www/mime.json',function(err,data){
        if(err){
            console.log(err)
        }else{
            var mime=JSON.parse(data.toString());
            console.log(mime);
            callback(mime);
        }
    })
};
//对应server.js部分修改 
  }else {
                mime.getMimes(fs,extName,function(msg){
                    var mime=msg[extName];
                    res.writeHead(200,{"Content-Type":mime+";charset='utf-8'"});
                    res.write(data);
                    res.end();
                });
            }
        });
    }
}).listen(8081);
//3.系统提供的events模块,事件的订阅发布
var event=require('events');
var emitter=new event.EventEmitter();
...
//
 }else {
                mime.getMimes(fs,emitter,extName);
                emitter.on('send_date',function(mime){  //------------------订阅
                    res.writeHead(200,{"Content-Type":mime+";charset='utf-8'"});
                   // res.write();
                    res.end(data);
                })

            }
        });
    }
}).listen(8081);

exports.getMimes=function (fs,emitter,extName) {
    fs.readFile('./www/mime.json',function(err,data){
        if(err){
            console.log(err)
        }else{
            var mime=JSON.parse(data.toString())[extName];
            console.log(mime);
            emitter.emit('send_date',mime) //------------------------发布
        }
    })
};

猜你喜欢

转载自blog.csdn.net/weixin_41641735/article/details/83243482