nodejs零基礎詳細教程2:模組化、fs檔案操作模組、http建立服務模組

來源:互聯網
上載者:User

標籤:div   箭頭   expr   listen   mongo   自訂   god   重用   就會   

第二章  建議學習時間4小時  課程共10章

學習方式:詳細閱讀,並手動實現相關代碼

學習目標:此教程將教會大家 安裝Node、搭建伺服器、express、mysql、mongodb、編寫後台商務邏輯、編寫介面,最後完成一個完整的項目後台,預計共10天課程。

 

模組兒化

 為什麼需要模組兒化?

我們以前的常規js代碼中,我們為了重用一些js代碼,是將js方法封裝起來,放到js檔案中,然後在HTML頁面中引入js,就可以在頁面中使用這些方法了。

當這種直接引入和調用的方式存在一些不友好的地方,比如,1、如果兩個js中有重名的方法,就會產生覆蓋。2、如果某個js需要調用另一個js裡的方法,那麼就對js引入的順序有限制,就比如我們使用jQuery的時候一般在js的最前面引入。

這樣就有了模組化的需求:將獨立功能的js封裝成一個模組,避免重名並且不必考慮引入順序問題。

  • Node.js遵守CommonJS規範(這個只是一種模組兒化的代碼編寫規範,具體的細節可自行搜尋瞭解,接下來我們寫具體的代碼)

那麼怎麼來實現模組兒化呢?

我們在自己的某個檔案夾中(樣本為nodeTest) , 先建立檔案夾 module, 在裡面建立 module01.js  module02.js  test.js,建立後的目錄結構如下:

 

模組兒化的實現需要三步:

1、編寫模組並暴露介面

在module01.js中寫入下面的代碼,編寫了兩個方法,並使用node內建的 module對象向外暴露介面。

(代碼解釋:module對象是Node內建的模組兒化對象,該對象下預設有一個Null 物件 -- exports ,我們將需要暴露的對象直接賦值給exports就向外暴露了介面,下一步將講解如何使用介面)

function fn01(){  //編寫一個方法 fn01    console.log("module01-fn01");}function fn02(){  //編寫一個方法 fn02    console.log("module01-fn02");}//暴露介面module.exports = {    "fn01":fn01,    "fn02":fn02}

 

2、使用介面

在test.js中寫入 如下代碼

var module01 = require("./module01.js"); //使用 require引入模組,並申明一個變數來接收介面暴露的對象module01.fn01(); //提供者暴露的方法

 解釋:(1)使用node內建方法 require引入模組,格式  require("檔案路徑"),【這裡的  ./  表示當前路徑 】, ()然後我們申明了一個變數 module01來接收引入模組暴露的對象,這個對象就是我們上一步中給exports賦值的那個對象,關係如下:

module01 == {
    "fn01":fn01,
    "fn02":fn02
}

既然我們使用 module01接收到了這個對象,我們就可以調用 裡面的方法或屬性了。 使用 module01.fn01(),就可以執行 module01.js 中的 fn01方法。

 

3、運行看效果

使用node 運行test.js的時候,就可以看到fn01方法執行 列印的 "module01-fn01";

 

 

 

多個模組的引用

我們上一步只引入了module01.js ,這一步我們引入多個模組

1、我們先將 module02.js 也寫成介面,代碼和module.js基本一致,只是 列印的 內容 改為了  "module02-fn01"

function fn01(){  //編寫一個方法 fn01    console.log("module02-fn01");}function fn02(){  //編寫一個方法 fn02    console.log("module02-fn02");}//暴露介面module.exports = {    "fn01":fn01,    "fn02":fn02}

2、我們在 test.js中引入模組 

將原來的test.js代碼修改成如下代碼:

var module01 = require("./module01.js"); //module01.js 的暴露對象 使用 變數 module01接收var module02 = require("./module02.js"); //module02.js 的暴露對象 使用 變數 module02接收module01.fn01(); //訪問module01.js的方法module02.fn02(); //訪問module02.js的方法

3、執行test.js

即可看到兩個模組的方法都被調用了,這裡我們可以看到,就算模組中使用了同樣的方法,在使用的時候,由於定義了不同的變數來接收,也不會互相影響,而且我們要使用哪個模組就直接引用就可以,這就是模組兒化的優勢。

 

模組兒化暴露介面的另一種方法

直接將需要暴露的方法以屬性 附加到 exports對象上。作用和上面的方法是一樣的,我們來修改一下module02.js的代碼

function fn01(){  //編寫一個方法 fn01    console.log("module02-fn01");}function fn02(){  //編寫一個方法 fn02    console.log("module02-fn02");}//暴露介面export.fn01 = fn01;export.fn02 = fn02;

此時運行test.js,效果和上一步是一樣的。

 

 

fs檔案操作模組

讀取檔案

node內建檔案操作模組 fs,使用時只需要直接引入即可

首先建立檔案 fs01.js  a.txt檔案

編輯 a.txt。任意寫入點文字  (注意 編碼格式 修改為 utf-8)

編輯 fs01.js,寫入一下代碼(代碼解釋在運行效果的後面)

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.readFile("./a.txt","utf-8",function(err,data){  //讀取檔案    console.log(err,data);});

運行,即可看到  的顯示,第一個箭頭null表示 沒有出錯, 第二個箭頭表示讀取的a.txt內部內容

 

解釋:  第一行代碼我們引入了 node的內建模組  fs (檔案操作模組)

第二行代碼調用了 fs模組下的讀取檔案方法  readFile,  內部傳入三個參數  ,1、讀取的檔案路徑 , 2、編碼格式, 3、回呼函數,回呼函數中有兩個參數  err 和 data ,  err表示錯誤資訊,當檔案讀取錯誤的時候會賦值錯誤提示,data表示讀取的檔案內容。

 

一般情況下,如果讀取出錯我們需要拋出異常終止程式。所以需要將代碼修改如下

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.readFile("./a.txt","utf-8",function(err,data){  //讀取檔案    if(err) throw err;    console.log(err,data);    //讀取的後續操作可寫在這裡});

 

寫入檔案  

使用 writeFile方法

將上一步讀取的資料寫入b.txt檔案中

說明:後續我都直接修改fs01.js的代碼來示範,大家可以自己建立新的js檔案來寫代碼和執行。

將 fs01.js代碼修改如下(中間添加寫入檔案的代碼):

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.readFile("./a.txt","utf-8",function(err,data){  //讀取檔案    if(err) throw err;    //讀取的後續操作可寫在這裡    fs.writeFile("./b.txt",data,function(err){  //寫入檔案        if(err) throw err;    })});

 

解釋:writeFile方法有三個參數,1、寫入的檔案路徑(如果沒有此檔案,node會自動建立一個b.txt),2、需要寫入的資料(這裡我們將從a.txt中讀取的資料 傳給 b.txt) , 3、回呼函數,只有一個參數,當出現寫入錯誤的時候,會有錯誤提示 err

執行fs01.js即可看到當前檔案夾中新增加了一個b.txt。且內部寫入了內容

 

 

writeFile是將內容替換掉,如果想要追加寫入,可以使用appendFile方法

我們修改 fs01.js的裡的寫入方法為 appendFile

 

然後多次執行 fs01.js

然後開啟 b.txt,就可以看到多次寫入了內容

 

刪除檔案 ,使用 unlink方法

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.unlink("./b.txt",function(err){  //刪除檔案    if(err) throw err;})

unlink方法有兩個參數,1、要刪除的路徑,2、回呼函數,如果出現錯誤,會有err提示

修改 fs01.js內容為上面代碼,然後執行 fs01.js,就可以看到 b.txt被刪除了

 

建立檔案夾

使用  mkdir  方法  ,該方法有兩個參數 1、檔案夾名,2、回呼函數,如果出現錯誤,會有err提示

修改 fs01.js內容為下面代碼,然後執行 fs01.js,就可以看到 在當前檔案夾中建立了 名為 c 的檔案夾

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.mkdir("c",function(err){  //建立 c 檔案    if(err) throw err;})

 

 

修改檔案名稱/檔案夾名

使用 remane,該方法有兩個參數 1、需要修改的檔案名稱(目前的目錄下),2、新的檔案名稱,3、回呼函數,如果出現錯誤,會有err提示

修改 fs01.js內容為下面代碼,然後執行 fs01.js,就可以看到 在當前檔案夾中 檔案夾 c  名字被修改為了 d

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.rename("c","d",function(err){  //將c 檔案夾名字 改為  d    if(err) throw err;})

 

 

修改 fs01.js內容為下面代碼,然後執行 fs01.js,就可以看到 在當前檔案夾中 檔案 a.txt  名字被修改為了 d.txt

var fs = require("fs"); //node 內建模組可直接引入  fs:檔案系統操作模組fs.rename("a.txt","d.txt",function(err){  //將a.txt 改為  d.txt    if(err) throw err;})

 

 

 

http模組,建立後台伺服器

 

 node內建建立服務的模組 http,使用時只需要直接引入即可

 首先建立檔案 http01.js ,然後添加如下代碼

var http = require("http");http.createServer(function(request,response){        console.log("request going"); //當瀏覽器訪問的時候,在控制台回列印此訊息    response.end("haha");//表示請求結束,將結果返回給瀏覽器}).listen(3000);

說明:

首先引入  http 模組 ,

然後調用  createServer方法建立服務,裡面只有一個參數(回呼函數:表示請求發生的時候需要執行的代碼【回到函數有兩個參數,1、請求資訊,2、相應資訊】),

最後需要添加連接埠監聽  listen(自訂連接埠號碼,這裡我們常規使用3000),

運行 http01.js, 如果沒有報錯,就表示 服務已經啟動,然後在瀏覽器中輸入  http://localhost:3000/  就可以訪問伺服器了,會顯示 返回的 "hehe" 文字;

注意:啟動服務後,再修改了js檔案以後,不會直接更新到頁面,需要命令列按 ctrl+c 結束運行,  再重新運行 該js 後  ,再重新整理 瀏覽器,才能看到效果。

當訪問以後,再看控制台,就可以看到列印的資訊

 

 

讀取一個檔案並傳輸給頁面

在當前檔案夾,建立a.txt檔案,寫入一段文字

 

然後修改http01.js的代碼為如下代碼,然後運行,即可將讀取的a.txt的資料寫入頁面

var http = require("http");//引入http模組var fs = require("fs"); //引入fs模組http.createServer(function(request,response){        fs.readFile("./a.txt","utf-8",function(err,data){  //讀取檔案       if(err) throw err;       response.end(data);//表示請求結束,將結果返回給瀏覽器   });}).listen(3000);

 

 

 

 

 好,今天就講這麼多,明天將講解:npm包管理、git github的使用。

 

nodejs零基礎詳細教程2:模組化、fs檔案操作模組、http建立服務模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.