标签:blog http io 使用 ar java 文件 sp div
【实现一个静态资源管理模块】
/**
*static_module.js
*/
var BASE_DIR = __dirname, //绝对路径
CONF = BASE_DIR + ‘/conf/‘, //conf文件的路径
STATIC = BASE_DIR + ‘/static‘, //静态文件的路径
mmieConf; //用来存储mmie json
//文件及其相关mmie类型保存在mmie_type.json里,读取这个json
var getMmieConf = function(){
var conf = {};
try{
var confStr = fs.readFileSync(CONF + ‘mmie_type.json‘, ‘utf8‘);//同步读取文件
conf = JSON.parse(confStr);
}catch{
util.debug(‘JSON parse fails‘);
}
return conf;
};
var util = require(‘util‘),
fs = require(‘fs‘),
http = require(‘http‘),
url = require(‘url‘),
path = require(‘path‘);
mmieConf = getMmieConf();
//获取静态文件的接口
//pathname:静态文件相对路径 req:requset对象 res:response对象
exports.getStaticFile = function(pathname, req, res){
var extName = path.extname(pathname); //path模块的extname方法可以获取url的文件后缀,例如‘.html‘
extName = extName ? extName.slice(1) : ‘‘; //‘html‘
var realPath = STATIC + pathname;
var mmieType = mmieConf[extName] || ‘text/plain‘;
fs.exists(realPath, function(exsit){ //判断文件是否存在
if( !exsit ){//如果不存在,返回404
res.writeHead(404, {‘Content-Type‘: ‘text/plain‘});
res.write(‘the file in‘ + pathname + ‘was not found‘);
res.end();
}else{//如果文件存在,判断文件是否符合缓存条件,如果符合就返回304,不符合就读取静态文件返回
var fileInfo = fs.statSync(realPath); //fs.statSync获取文件相关信息,返回的是一个json,其中mtime属性记录了文件的最后修改时间
var lastModifiedTime = fileInfo.mtime.toUTCString();
//设置缓存相关的头
if(mmieConf[extName]){
var date = new Date();
res.setHeader(‘expires‘, date.toUTCString());//设置过期时间
res.setHeader(‘Cache-Control‘, ‘max-age=‘ + 60*60*24*365);
}
//判断是否过期,如果未过期就304,已过期就读取文件
if(req.headers[‘if-modified-since‘] && lastModifiedTime = req.header[‘if-modified-since‘]){//req对象中的header有记录文件的最后修改时间,如果和服务 //器的最后修改时间一致说明文件一直没有被改动过,304就好了
res.writeHead(304, ‘not modified‘);
res.end();
}else{//读取静态文件
fs.readFile(realPath, ‘binary‘, function(err, file){
if(err){//读取文件出错啦
res.writeHead(500, ‘Content-Type:plain‘);
res.end(err);
}else{
res.setHeader(‘Last-Modified‘, lastModifiedTime);
res.writeHead(‘200‘, {‘Content-Type‘: mmieType});
res.write(file, ‘binary‘);
res.end();
}
})
}
}
});
}
使用这个模块:
var staticModule = require(‘./static_module‘);
http.createServer(function(res, req){
var pathname = url.parse(req.url).pathname;//获取相对路径
if( pathname == ‘/favicon.ico‘){
return;
}else if( pathname == ‘/index‘ || pathname == ‘/‘ ){
gotoIndex();
}else{
staticModule.getStaticFile(pathname, req, res);
}
});
标签:blog http io 使用 ar java 文件 sp div
原文地址:http://www.cnblogs.com/it-snail/p/4008346.html