2-資源文件請求 path包 require導包/文件查找原則 exports/__dirname 使用第三方包 后端渲染模板

資源文件請求

  • 如果資源在一個頁面中, 這些資源文件會自動發(fā)送請求, 而且這些路徑默認和資源文件, 所在的路徑是一致的

  • 當如果我們直接讀取對應的html頁面的時候,沒有加載其他的例如圖片以及css資源, 那么不會顯示對應的圖片以及css樣式

  • 靜態(tài)資源請求的時候, 路徑一般不包含對應的static或者public

    • 通過對應的pathname作為讀取資源的路徑,注意這個pathname請求的時候, 一般不包含static,所以我們需要拼接

path包

  • 通過對應的path來獲取對應的pathname的后綴名
    • var extName = path.extname(pathName);

require導包原理

  • 原理
    • 當導入一個文件, 若此文件中是對應的代碼, 使用require導入相當于把對應的代碼, 導入到當前的文件中
  • 執(zhí)行的過程
    1. 我們會把對應的代碼通過一個function的函數(shù)來拼接成一個字符串

    2. 然后使用eval函數(shù)執(zhí)行

       /*例如
       1. 當前我們會使用function(){拼接對應的console.log('hello world'),然后拼接}
       2. 形成function(){console.log('hello world')}這個一個字符串, 然后放入到eval函數(shù)中執(zhí)行*/
      

require文件查找原則

  1. 當導入一個文件的時候, 如果不寫對應的路徑

    • 那么系統(tǒng)會默認去node_moduls這個文件夾
    • 下面去尋找和導入的文件同名的文件, 如果有這個文件就會加載
      • 例如: var fs = require('fs');
  2. 當導入一個文件的時候, 如果不設置路徑和后綴名

    • 那么會去對應的node_modules下面找同名的文件(就是找foo.js).
    • 如果這個文件不存在, 會把這個文件當成一個文件夾, 找這個文件夾下對應的index.js文件加載.
      • 加載index.js文件的原因
        1. 一般在一個文件夾下面會有一個package.json文件
        2. 該文件表示當前的文件夾的配置文件, 這個配置中有一個main的字段
        3. 對應的value值決定了我們默認加載哪個文件

使用第三方包的過程

  1. 使用cd命令進入到項目所在的目錄(window系統(tǒng)中的此命令不可以跨盤符)
  2. 使用npm install + 包名, 下載對應的包
    • 如果對應的文件夾中沒有mode_modules這個文件夾, 系統(tǒng)會自動創(chuàng)建此文件夾, 然后把對應的包放在此文件夾下

exports使用

  • 如果在一個文件中定義了變量和函數(shù)只能在這個文件內部使用
    • 把這個文件導入到其他的文件中, 里面的變量和函數(shù)是不能使用的
  • 如果想要在外部使用, 方法如下
    • 通過exports.msg = msg;暴露把對應的變量和函數(shù)
    • 通過module.exports = People;暴露對應的類(構造函數(shù))

__dirname

  • 當某個文件包導入別的文件中, 如果當前文件中有一些路徑的設置, 如果只是在當前文件, 這個路徑可以參考當前文件(b.js), 如果要是被導入到其他的文件中, 我們設置路徑的時候, 參考的文件是其他的文件(a.js)

  • 報錯: No such file or directory, ...

  • 解決: 讓路徑參考a.js, 但是如果當其層級結構非常深的時候, 所以可以利用__dirname來解決

    • __dirname: 它寫在上面地方, 就表示當前文件所在的目錄. 相當于用相對形式來表示絕對路徑.
      • 如, 當前在b.js中, 如果b.js的去路徑是c:/abc/1234/b.js, __dirname表示c:/abc/1234

處理對應的的post請求

    /*處理提交的數(shù)據(jù)
    * 一般提交的數(shù)據(jù)比較多, 如果數(shù)據(jù)都提交完成后處理
    * 有可能會阻塞程序運行
    * 為了避免阻塞,提高效率,一般把對應的數(shù)據(jù)拆分成不同各個小的部分
    * 然后當這些小的部分的數(shù)據(jù)過來以后,直接處理
    * 最后把這些小的數(shù)據(jù)拼接起來,形成我們最終的數(shù)據(jù)
    * 1.我們需要處理提交過來的各個部分,所以我們需要監(jiān)聽數(shù)據(jù)
    * 2.然后為我們還需要監(jiān)聽數(shù)據(jù)的完成,如果完成后,我們直接顯示數(shù)據(jù)
    * addListener:第一個參數(shù)表示監(jiān)聽的標識,一般是固定,第二個對應的回調
    * 回調中有傳遞過來的數(shù)據(jù)
    * */

    var http = require('http');
    var querystring = require('querystring');
    var server = http.createServer(function (req,res) {
    
        if(req.url=='/dopost' && req.method.toLowerCase() =='post'){
            var allString = '';
            req.addListener('data',function (chunk) {
                /*只有有數(shù)據(jù)傳遞過來,我們就需要對數(shù)據(jù)進行拼接
                * 我們可以設置一個字符串來拼接數(shù)據(jù)*/
                allString += chunk; 
            })
        
            /*2.監(jiān)聽數(shù)據(jù)完成*/
            req.addListener('end',function (err) {
                var allStringO = querystring.parse(allString)
        
                console.log(allStringO);    
            })
        }
    })
    server.listen(3000,'127.0.0.1');

formidable包使用

  • 使用formidable包處理post請求

      /*1.創(chuàng)建表單*/
      var form = new formidable.IncomingForm();
    
      /*1.1我們在解析之前設置對應的上傳圖片的目錄*/
      form.uploadDir = "./uploads";
    
      /*2.使用表單解析對應的請求
      * parse中有兩個參數(shù),第一個參數(shù)表示對應的請求
      * 第二個參數(shù)表示回調,回調中有是三個參數(shù)
      * 第一個表示錯誤
      * 第二個fields:表示和域相關的東西,域就是凡是input就可以看做域
      * 第三個參數(shù)files:表示和文件相關的東西*/
      form.parse(req,function (err,fields,files) {
          if(err){
              console.log(err);
              return;
          }
          console.log(fields);
          console.log(files);
          console.log(files.tupian.path);
      })
    

silly-datetime包處理圖片唯一性

  • 規(guī)則: 一般采用一個時間戳+一個隨機數(shù)字

      var http = require('http');
      var formidable = require('formidable');
      var sd = require('silly-datetime');
      var fs = require('fs');
      
      var server = http.createServer(function (req,res) {
      
          /*判斷路徑和請求方法,然后處理對應的請求數(shù)據(jù)*/
          if(req.url=='/dopost' && req.method.toLowerCase() =='post'){
              
              var form = new formidable.IncomingForm();
              form.uploadDir = "./uploads";
      
              /*實際開發(fā)中,需要根據(jù)我們自己的規(guī)則來給對應的圖片設置
              * 對應的名稱用以保證圖片的唯一性              
              * HH:如果是大寫表示對應的24小時
              * hh:表示12小時*/
              var newTime = sd.format(new Date(),'YYYYMMDDHHmmss');
              var randomNum = parseInt(Math.random()*89999+100000);
    
              form.parse(req,function (err,fields,files) {
      
                  /*我們需要使用新的規(guī)則替換舊的路徑,所以我們需要獲取舊的的路徑
                   * 因為我們在使用新的路徑替換舊的路徑的時候,我們最好使用絕對路徑
                   * 所以我們獲取新的路徑和舊的路徑的時候,最好設置為絕對路徑
                   * 在解析路徑的時候,會把最后一個/之前的所有的東西都解析成路徑*/
                  var oldPath = __dirname+'/'+files.tupian.path;
                  var newPath = __dirname+'/uploads'+'/uploads'+newTime + randomNum+'.jpg';
      
                  /*使用fs的rename方法來設置替換路徑
                  * rename:第一個參數(shù)表示舊的路徑
                  * 第二個參數(shù)表示新的路徑,
                  * 第三個參數(shù)表示回調*/
                  fs.rename(oldPath,newPath,function (err) {
                      if(err){
                          console.log(err);       
                          return;
                      }       
                  })      
              })      
              res.end();      
          }       
      })
      server.listen(3000,'127.0.0.1');
    

后端模板的渲染過程

  • 過程
    • 當對應的前端發(fā)送請求的時候,我們接受到請求
    • 然后在后端把對應的頁面使用數(shù)據(jù)渲染完成,然后發(fā)送給前端
  • 使用后端渲染EJS模板
    1. 設置模板
      • 一般是一個字符串. 我們設置這個字符串的時候一般會把對應的變量以及當前程序無法識別的東西放置在一個<%%>中間
      • 變量: <%= a%>
    2. 設置數(shù)據(jù)
      • 一般是一個字典
    3. 使用數(shù)據(jù)渲染模板
      • ejs.render(模板,數(shù)據(jù))
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末千埃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劲室,老刑警劉巖霹肝,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穆趴,死亡現(xiàn)場離奇詭異饿凛,居然都是意外死亡只泼,警方通過查閱死者的電腦和手機剖笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來请唱,“玉大人弥咪,你說我怎么就攤上這事∈螅” “怎么了聚至?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長本橙。 經常有香客問我扳躬,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任贷币,我火速辦了婚禮击胜,結果婚禮上,老公的妹妹穿的比我還像新娘役纹。我一直安慰自己偶摔,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布促脉。 她就那樣靜靜地躺著啰挪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘲叔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天抽活,我揣著相機與錄音硫戈,去河邊找鬼。 笑死下硕,一個胖子當著我的面吹牛丁逝,可吹牛的內容都是我干的。 我是一名探鬼主播梭姓,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霜幼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誉尖?” 一聲冷哼從身側響起罪既,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铡恕,沒想到半個月后琢感,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡探熔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年驹针,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀艰。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柬甥,死狀恐怖,靈堂內的尸體忽然破棺而出其垄,到底是詐尸還是另有隱情苛蒲,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布绿满,位于F島的核電站撤防,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜寄月,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一辜膝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漾肮,春花似錦厂抖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谭溉,卻和暖如春墙懂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扮念。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工损搬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柜与。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓巧勤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弄匕。 傳聞我的和親對象是個殘疾皇子颅悉,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容