最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js靜態(tài)文件服務(wù)器改進(jìn)版

 更新時(shí)間:2016年01月10日 08:45:07   投稿:mrr  
這篇文章主要介紹了Node.js靜態(tài)文件服務(wù)器改進(jìn)版的相關(guān)資料,需要的朋友可以參考下

首先還是先感謝github,感謝github上提供此段源碼的作者。跟昨晚的來比今天的靜態(tài)文件服務(wù)器有點(diǎn)點(diǎn)復(fù)雜些,可以學(xué)到很多新的東西。

仔細(xì)會(huì)發(fā)現(xiàn)這次的代碼多了一個(gè)fs.stat函數(shù)和ReadStream對(duì)象的pipe函數(shù),stat這個(gè)函數(shù)是用來獲取文件信息。第一個(gè)參數(shù)是傳入文件路徑,第二個(gè)則是回調(diào)函數(shù),回調(diào)函數(shù)的第二個(gè)參數(shù)stats的屬性為文件的基本信息。pipe函數(shù)用于將這個(gè)可讀流和destination目標(biāo)可寫流連接起來,傳入這個(gè)流中的數(shù)據(jù)將會(huì)寫入到destination流中。通過在必要時(shí)暫停和恢復(fù)流,來源流和目的流得以保持同步。

該靜態(tài)文件服務(wù)器的改進(jìn)點(diǎn)在于使用了Last-Modified和If-Modified-Since報(bào)文頭,可以不必要給瀏覽器返回它已經(jīng)存在的文件。順便可以根據(jù)瀏覽器請(qǐng)求資源的壓縮方式返回給資源進(jìn)行g(shù)zip或者deflate壓縮。

var PORT = 8000;
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
var mime = require("./mime").types;
var config = require("./config");
var zlib = require("zlib");
var server = http.createServer(function(request, response) {
 response.setHeader("Server", "Node/V5");
 var pathname = url.parse(request.url).pathname;
 console.log("url = " + pathname);
 if (pathname.slice(-1) === "/") {
  pathname = pathname + config.Welcome.file;
 }
 var realPath = __dirname + "/" + path.join("assets", path.normalize(pathname.replace(/\.\./g, "")));
 console.log("realPath = " + realPath);
 var pathHandle = function (realPath) {
  fs.stat(realPath, function (err, stats) {
   if (err) {
    response.writeHead(404, "Not Found", {'Content-Type': 'text/plain'});
    response.write("stats = " + stats);
    response.write("This request URL " + pathname + " was not found on this server.");
    response.end();
   } else {
    if (stats.isDirectory()) {
     realPath = path.join(realPath, "/", config.Welcome.file);
     pathHandle(realPath);
    } else {
     var ext = path.extname(realPath);
     ext = ext ? ext.slice(1) : 'unknown';
     var contentType = mime[ext] || "text/plain";
     response.setHeader("Content-Type", contentType);
     //獲得文件的修改時(shí)間 
     var lastModified = stats.mtime.toUTCString();
     var ifModifiedSince = "If-Modified-Since".toLowerCase();
     //設(shè)置Last-Modified
     //服務(wù)器給瀏覽器返回文件最后一次修改時(shí)間Last-Modified
     response.setHeader("Last-Modified", lastModified);

     if (ext.match(config.Expires.fileMatch)) {
      var expires = new Date();
      expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
      response.setHeader("Expires", expires.toUTCString());
      response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
     }
     //服務(wù)器接收瀏覽器發(fā)送過來的If-Modified-Since報(bào)文頭
     //日期相同表示該資源沒有變化則返回304
     //告訴瀏覽器該資源你已經(jīng)有了,不需要再請(qǐng)求了
     if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {
      response.writeHead(304, "Not Modified");
      response.end();
     } else {
      var raw = fs.createReadStream(realPath);
      var acceptEncoding = request.headers['accept-encoding'] || "";
      var matched = ext.match(config.Compress.match); 
      if (matched && acceptEncoding.match(/\bgzip\b/)) {
       response.writeHead(200, "Ok", {'Content-Encoding': 'gzip'});
       raw.pipe(zlib.createGzip()).pipe(response);
      } else if (matched && acceptEncoding.match(/\bdeflate\b/)) {
       response.writeHead(200, "Ok", {'Content-Encoding': 'deflate'});
       raw.pipe(zlib.createDeflate()).pipe(response);
      } else {
       response.writeHead(200, "Ok");
       raw.pipe(response);
      }
     }
    }
   }
  });
 };

 pathHandle(realPath);
});
server.listen(PORT);
console.log("Server runing at port: " + PORT + ".");

Expires字段聲明了一個(gè)網(wǎng)頁或URL地址不再被瀏覽器緩存的時(shí)間,一旦超過了這個(gè)時(shí)間,瀏覽器都應(yīng)該聯(lián)系原始服務(wù)器。這里設(shè)置失效時(shí)間為1年。

exports.Expires = {
 fileMatch: /^(gif|png|jpg|js|css)$/ig,
 maxAge: 60*60*24*365
};
exports.Compress = {
 match: /css|js|html/ig
};
exports.Welcome = {
 file: "index.html"
};

枚舉各種資源的類型,可根據(jù)擴(kuò)展名設(shè)置Content-Type。

exports.types = {
 "css": "text/css",
 "gif": "image/gif",
 "html": "text/html",
 "ico": "image/x-icon",
 "jpeg": "image/jpeg",
 "jpg": "image/jpeg",
 "js": "text/javascript",
 "json": "application/json",
 "pdf": "application/pdf",
 "png": "image/png",
 "svg": "image/svg+xml",
 "swf": "application/x-shockwave-flash",
 "tiff": "image/tiff",
 "txt": "text/plain",
 "wav": "audio/x-wav",
 "wma": "audio/x-ms-wma",
 "wmv": "video/x-ms-wmv",
 "xml": "text/xml"
};

相關(guān)文章

  • nodejs利用readline提示輸入內(nèi)容實(shí)例代碼

    nodejs利用readline提示輸入內(nèi)容實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于nodejs利用readline提示輸入內(nèi)容的相關(guān)資料,Readline是Node.js里實(shí)現(xiàn)標(biāo)準(zhǔn)輸入輸出的封裝好的模塊,通過這個(gè)模塊我們可以以逐行的方式讀取數(shù)據(jù)流,需要的朋友可以參考下
    2021-07-07
  • nest.js,egg.js,midway,express,koa的區(qū)別小結(jié)

    nest.js,egg.js,midway,express,koa的區(qū)別小結(jié)

    本文主要介紹了nest.js,egg.js,midway,express,koa的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 安裝node.js和npm的一些常見報(bào)錯(cuò)

    安裝node.js和npm的一些常見報(bào)錯(cuò)

    NVM(Node?Version?Manager)是一個(gè)用于在同一機(jī)器上同時(shí)安裝并管理多個(gè)Node.js版本的工具,這篇文章主要給大家介紹了關(guān)于安裝node.js和npm的一些常見報(bào)錯(cuò),需要的朋友可以參考下
    2023-06-06
  • Node快速切換版本、版本回退(降級(jí))、版本更新(升級(jí))

    Node快速切換版本、版本回退(降級(jí))、版本更新(升級(jí))

    這篇文章主要介紹了Node快速切換版本、版本回退(降級(jí))、版本更新(升級(jí)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài)

    node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài)

    這篇文章主要介紹了node爬取新型冠狀病毒的疫情實(shí)時(shí)動(dòng)態(tài),非常不錯(cuò),本文通過實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2020-02-02
  • 從零揭秘npm install的黑科技

    從零揭秘npm install的黑科技

    通過npm package manager來安裝和管理包是我們最為常見的方式之一,本文將從淺入深地帶大家剖析一下npm install的執(zhí)行過程,感興趣的可以學(xué)習(xí)一下
    2023-05-05
  • 深入解析nodejs HTTP服務(wù)

    深入解析nodejs HTTP服務(wù)

    本篇文章主要介紹了深入解析nodejs HTTP服務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Node.js引入U(xiǎn)IBootstrap的方法示例

    Node.js引入U(xiǎn)IBootstrap的方法示例

    這篇文章主要介紹了Node.js引入U(xiǎn)IBootstrap的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Nodejs監(jiān)聽日志文件的變化的過程解析

    Nodejs監(jiān)聽日志文件的變化的過程解析

    最近有在做日志文件的分析,其中有一個(gè)需求:A服務(wù)器項(xiàng)目需要用Nodejs監(jiān)聽日志文件的變化,當(dāng)項(xiàng)目產(chǎn)生了新的日志信息,將新的部分通過socket傳輸?shù)紹服務(wù)器項(xiàng)目,本文重點(diǎn)給大家介紹Nodejs監(jiān)聽日志文件的變化的相關(guān)知識(shí),一起看看吧
    2019-08-08
  • nodejs使用socket5進(jìn)行代理請(qǐng)求的實(shí)現(xiàn)

    nodejs使用socket5進(jìn)行代理請(qǐng)求的實(shí)現(xiàn)

    這篇文章主要介紹了nodejs使用socket5進(jìn)行代理請(qǐng)求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論

惠州市| 磐安县| 德庆县| 资中县| 开平市| 三都| 扶风县| 壶关县| 大新县| 沧源| 明光市| 隆德县| 太保市| 方山县| 长葛市| 湖北省| 任丘市| 色达县| 尚志市| 林芝县| 乐陵市| 垫江县| 凉城县| 临澧县| 青海省| 织金县| 宝坻区| 德保县| 平邑县| 环江| 东安县| 张家川| 济阳县| 巴里| 蒲江县| 拜城县| 新密市| 石台县| 武隆县| 光山县| 宜阳县|