Node.js學(xué)習(xí)筆記2-文件與靜態(tài)資源

  • 注意: 撰寫本文目的主要是為了給自己做一個(gè)備忘錄询筏,如果你學(xué)過(guò)Node.js并且希望從本文中找到一些忘記的知識(shí)點(diǎn)绵脯,那么你可以閱讀本文章渊迁。由于文章內(nèi)講解并不是很多,因此此文章并不適合小白入門使用剃盾。

4.文件

4.1.讀取文件

  • 對(duì)文件的操作主要是依賴fs模塊腺占,因此我們需要導(dǎo)入fs模塊淤袜。下面的示例代碼是對(duì)文件的簡(jiǎn)單讀取操作,同時(shí)避免對(duì)圖標(biāo)進(jìn)行訪問(wèn)衰伯,為請(qǐng)求加上請(qǐng)求頭铡羡,以指定編碼打開(kāi)文件。
var http = require("http");
var fs = require("fs");

var server = http.createServer(function (req, res) {

  if (req.url == "/favicon.ico") {
    return; //避免訪問(wèn)圖標(biāo)
  }

  var userid = parseInt(Math.random * 89999) + 10000;
  //給用戶加一個(gè)5位數(shù)的隨機(jī)id
  console.log("歡迎" + userid);

  //設(shè)置http頭部意鲸,狀態(tài)碼是200烦周,文件類型是html
  res.writeHead(200, {
    "Content-Type": "text/html;charset=UTF8"
  });

  fs.readFile("./test/1.txt", {
    "charset": "utf-8"
  }, function (err, data) {
    if (err) {
      throw err;
    }
    console.log(userid + "文件讀取完畢");
    res.end(data);
  });
});
server.listen(3000, "127.0.0.1");

4.2.文件目錄操作

  • 在下面的代碼中,你將會(huì)看到與創(chuàng)建文件及創(chuàng)建文件夾相關(guān)的細(xì)節(jié)知識(shí)點(diǎn)怎顾、路徑文件狀態(tài)的檢測(cè)——是否是文件夾等论矾。
  • 下面的程序會(huì)以數(shù)組的形式輸出album目錄下的所有文件夾名稱。
var http = require("http");
var fs = require("fs");

var server = http.createServer(function (req, res) {

  if (req.url == "/favicon.ico") {
    return; //避免訪問(wèn)圖標(biāo)
  }

  //發(fā)現(xiàn):文件夾必須要一層一層的創(chuàng)建
  // fs.mkdir("./album", function (err) {
  //   if (err) {
  //     throw err;
  //   }
  // });
  // fs.mkdir("./album/demo", function (err) {
  //   if (err) {
  //     throw err;
  //   }
  // });

  //檢測(cè)該路徑文件的狀態(tài)
  // fs.stat("./album/demo", function (err, stats) {
  //   //檢測(cè)這個(gè)路徑是不是一個(gè)文件夾
  //   console.log("該路徑文件是不是一個(gè)文件夾:"+stats.isDirectory());
  // })

  //只存儲(chǔ)所有的文件夾=
  var wenjianjia = [];
  fs.readdir("./album/", function (err, files) {
    //files是個(gè)數(shù)組杆勇,包括./album文件夾中所有的文件及文件夾
    //迭代器就是強(qiáng)行把異步函數(shù),變成同步的函數(shù)
    (function iterator(i) {
      //遍歷結(jié)束
      if (i == files.length) {
        console.log(wenjianjia);
        return;
      }
      //stat檢測(cè)狀態(tài)
      fs.stat("./album/" + files[i], function (err, stats) {
        if (stats.isDirectory()) {
          wenjianjia.push(files[i]);
        }
        iterator(i + 1);
      })
    })(0);
  });

  res.end();

});
server.listen(3000, "127.0.0.1");

5.靜態(tài)資源

  • 創(chuàng)建static文件目錄饱亿,static文件目錄下包含幾個(gè)html文件蚜退,現(xiàn)在我們通過(guò)將這些文件的名稱作為請(qǐng)求URL從而實(shí)現(xiàn)對(duì)這些靜態(tài)文件的訪問(wèn)。
  • 由前面的例子我們可以知道彪笼,當(dāng)圖片需要在網(wǎng)頁(yè)上顯示時(shí)钻注,也需要通過(guò)發(fā)送請(qǐng)求的方式才能顯示在網(wǎng)頁(yè)上,那么html文件也不例外配猫,并且我們?cè)L問(wèn)的文件可能會(huì)有很多種格式幅恋。我們可以將這些文件與對(duì)應(yīng)的格式代碼放入一個(gè)json文件中,然后請(qǐng)求時(shí)根據(jù)文件后綴在json文件中取得文件格式代碼泵肄,這樣我們只需要一個(gè)請(qǐng)求實(shí)現(xiàn)即可對(duì)所有文件請(qǐng)求進(jìn)行處理捆交。

Node示例代碼:

var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");

var server = http.createServer(function(req, res) {
  //得到用戶路徑
  var pathname = url.parse(req.url).pathname;
  var fileUrl = "./"+path.normalize("./static/"+pathname);
  console.log(fileUrl);
  if (pathname == "/") {
    pathname = "index.html";
  }

  //拓展名
  var extname = path.extname(pathname);

  //真的讀取這個(gè)文件
  fs.readFile("./static/" + pathname, function(err, data) {
    if (err) {
      //如果此文件不存在,就應(yīng)該用404返回
      fs.readFile("./static/404.html", function(err, data) {
        res.writeHead(404, {
          "Content-Type": "text/html;charset=UTF8"
        });
        res.end(data);
      });
      return;
    }

    getMime(extname,function (mime) {
        res.writeHead(200, {"Content-Type": mime});
        res.end(data);
    });
  });
});
server.listen(3000, "127.0.0.1");

getMime()函數(shù)

function getMime(extname,callback) {
  //讀取mime.json文件腐巢,得到JSON品追,根據(jù)extname key,返回對(duì)應(yīng)的value
  //讀取文件
  fs.readFile("./mime.json",function (err,data) {
     if(err){
       throw Error("找不到mime文件");
       return;
     }
     //轉(zhuǎn)成JSON
     var mimeJSON = JSON.parse(data);
     var mime = mimeJSON[extname] || "text/plain";
     callback(mime);
  });
}

JSON文件:

{
  ".html": "text/html",
  ".jpg": "image/jpg",
  ".css": "text/css"
}

文集推薦:

Java基礎(chǔ)方法集1
Python基礎(chǔ)知識(shí)完整版
Spring Boot學(xué)習(xí)筆記
Linux指令進(jìn)階
Java高并發(fā)編程
SpringMVC基礎(chǔ)知識(shí)進(jìn)階
Mysql基礎(chǔ)知識(shí)完整版
健康管理系統(tǒng)學(xué)習(xí)花絮(學(xué)習(xí)記錄)
Node.js基礎(chǔ)知識(shí)(隨手筆記)
MongoDB基礎(chǔ)知識(shí)
Dubbo學(xué)習(xí)筆記
Vue學(xué)習(xí)筆記(隨手筆記)

聲明:發(fā)表此文是出于傳遞更多信息之目的冯丙。若有來(lái)源標(biāo)注錯(cuò)誤或侵犯了您的合法權(quán)益肉瓦,請(qǐng)作者持權(quán)屬證明與本我們(QQ:981086665;郵箱:981086665@qq.com)聯(lián)系聯(lián)系胃惜,我們將及時(shí)更正泞莉、刪除,謝謝船殉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲫趁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子利虫,更是在濱河造成了極大的恐慌饮寞,老刑警劉巖孝扛,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幽崩,居然都是意外死亡苦始,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門慌申,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陌选,“玉大人,你說(shuō)我怎么就攤上這事蹄溉∽捎停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵柒爵,是天一觀的道長(zhǎng)役电。 經(jīng)常有香客問(wèn)我,道長(zhǎng)棉胀,這世上最難降的妖魔是什么法瑟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮唁奢,結(jié)果婚禮上霎挟,老公的妹妹穿的比我還像新娘。我一直安慰自己麻掸,他們只是感情好酥夭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脊奋,像睡著了一般熬北。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诚隙,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天蒜埋,我揣著相機(jī)與錄音,去河邊找鬼最楷。 笑死整份,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的籽孙。 我是一名探鬼主播烈评,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼犯建!你這毒婦竟也來(lái)了讲冠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤适瓦,失蹤者是張志新(化名)和其女友劉穎竿开,沒(méi)想到半個(gè)月后谱仪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡否彩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年疯攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片列荔。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敬尺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴浙,到底是詐尸還是另有隱情砂吞,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布崎溃,位于F島的核電站蜻直,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袁串。R本人自食惡果不足惜概而,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望般婆。 院中可真熱鬧,春花似錦朵逝、人聲如沸蔚袍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)啤咽。三九已至,卻和暖如春渠脉,著一層夾襖步出監(jiān)牢的瞬間宇整,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工芋膘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳞青,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓为朋,卻偏偏與公主長(zhǎng)得像臂拓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子习寸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348