现存在以下图所示的文件目录:
咱们但愿经过02.js来实现可以静态加载static中的文件
这篇博客是个人上一篇博客静态资源管理续篇,在上一篇博客中,由于遇到加载json格式的文件遇到了问题,因此写了一个续篇,若是有感兴趣的小伙伴能够看一下
实现代码以下:javascript
var http = require('http');
var url = require('url');
var fs = require('fs');
var path = require('path');
var server = http.createServer(function (req,res) {
//这里若是不用req.url来判断,那么无论用户输入什么操做,执行的操做都是同样的
//获得地址
var pathname = url.parse(req.url).pathname;
//不处理小图标的请求
if(pathname == '/favicon.ico'){
return;
}
//判断此时用户输入的是文件地址仍是文件夹地址
//若是是文件夹地址,那么自动请求这个文件夹中的index.html
if(pathname.indexOf('.') == -1){
pathname += 'index.html';
}
//获得用户输入的文件的拓展名
var extname = path.extname(pathname);
console.log(pathname);
fs.readFile('./static/'+pathname,function (err,data) {
if(err){
//若是页面报错,则让它返回一个新的页面
fs.readFile('./static/404.html',function (err,data) {
res.writeHead(200,{'Content-Type':'text/html;charset=UTF8'});
res.end(data);
})
return;
}
//读完文件以后作的事情
console.log(process.cwd());
var mime = getMime(extname);
res.writeHead(200,{'Content-Type':mime+';charset=UTF8'});
res.end(data);
})
}).listen(80,'127.0.0.1');
function getMime(extname) {
//读取mime.josn文件,获得JOSN,根据extname key ,f返回对应的value值
switch (extname){
case '.html':
return 'text/html';
break;
case '.css':
return 'text/css';
break;
case '.img':
return 'image/img';
break;
case '.json':
fs.readFile('./static/mime.json',function (err,data) {
if(err){
throw Error("找不到mime.json文件!");
return;
}
//转成JSON
console.log(typeof data);
//利用json.parse将一个josn字符串解析成为json格式
var mimeJSON = JSON.parse(data);
console.log(mimeJSON[extname]);
return mimeJSON[extname];
})
}
}
当咱们读取到文件的扩展名为json时,咱们读取这个json格式的文件,而后利用JSON.parse()的方法将JSON字符串转化为JSON对象,而后在这个JSON对象中取到对应json扩展名的MIME类型。
但是,咱们却惊讶的发现响应头中的content-type类型是undefined,
但是咱们不是已经在代码的这个地方书写了文件类型吗?
这是由于getMime()函数,当其中传入的参数为‘.json’,函数执行代码包含异步操做,即读取这个json文件,因此,当文件还未读取完毕,mime还未赋值时,mime就已经被写入content-type中,也就是undefined;
那咱们该怎么作?
咱们采起给getMime强行加一个回调函数,当传入文件的拓展名以后再执行回调函数中的内容,将mime的值赋给content-type,这样就能够避免异步加载的问题。
现将代码修改以下:php
getMime(extname,function(mime){
res.writeHead(200,{'Content-Type':mime+';charset=UTF8'});
res.end(data);
})
这样等到参数mime的值返回以后咱们才能执行将类型值赋给Content-type的操做。对应的getMime()函数也要进行对应修改:css
function getMime(extname,callback){
//读取mime的json文件,将对应扩展名的MIME类型名返回
fs.readfile('./static/mime.json',function(err,data){
if(err){
throw Error('找不到mime.json类型的文件!');
}
//将json字符串转换为json对象
var mimeJSON = JSON.parse(data);
var mime = mimeJSON[extname] || 'text/plain ';
callback(mime);
})
}