zoukankan      html  css  js  c++  java
  • 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里,读取这个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);
        }
    
    });                
    

      

      

  • 相关阅读:
    Maven相关知识片
    fastjson使用
    Block pool ID needed, but service not yet registered with NN java.lang.Exception: trace 异常解决
    JVM之内存结构详解
    ContextCleaner ——Spark 应用程序的垃圾回收器
    重新认识Java 8的HashMap
    HDFS NameNode内存全景
    HDFS的NameNode与SecondaryNameNode的工作原理
    大数据——基础知识
    HDFS数据定期清理
  • 原文地址:https://www.cnblogs.com/it-snail/p/4008346.html
Copyright © 2011-2022 走看看