首页 > 代码库 > node.js--静态文件请求模块

node.js--静态文件请求模块

【实现一个静态资源管理模块】

 

/**  *static_module.js  */var BASE_DIR = __dirname,   //绝对路径    CONF = BASE_DIR + ‘/conf/‘,    //conf文件的路径    STATIC = BASE_DIR + ‘/static‘,  //静态文件的路径    mmieConf;  //用来存储mmie json//文件及其相关mmie类型保存在mmie_type.json里,读取这个jsonvar 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);    }});                

  

  

node.js--静态文件请求模块