node.js零基礎詳細教程(2):模塊化、fs文件操做模塊、http建立服務模塊

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

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

學習目標:此教程將教會你們 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏輯、編寫接口,最後完成一個完整的項目後臺,預計共10天課程。git

 

模塊兒化github


 爲何須要模塊兒化?sql

咱們之前的常規js代碼中,咱們爲了重用一些js代碼,是將js方法封裝起來,放到js文件中,而後在HTML頁面中引入js,就能夠在頁面中使用這些方法了。mongodb

當這種直接引入和調用的方式存在一些不友好的地方,好比,一、若是兩個js中有重名的方法,就會產生覆蓋。二、若是某個js須要調用另外一個js裏的方法,那麼就對js引入的順序有限制,就好比咱們使用jQuery的時候通常在js的最前面引入。express

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

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

那麼怎麼來實現模塊兒化呢?瀏覽器

咱們在本身的某個文件夾中(示例爲nodeTest) , 先建立文件夾 module, 在裏面建立 module01.js  module02.js  test.js,建立後的目錄結構以下:服務器

 

注:上圖那個文件結構知識示例,能夠命令行 在對應目錄 運行  tree /f  打印

 

模塊兒化的實現須要三步:

一、編寫模塊並暴露接口

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

(代碼解釋:module對象是Node自帶的模塊兒化對象,該對象下默認有一個空對象 -- exports ,咱們將須要暴露的對象直接賦值給exports就向外暴露了接口,下一步將講解如何使用接口)

function fn01(){  //編寫一個方法 fn01
    console.log("module01-fn01");
}
function fn02(){  //編寫一個方法 fn02
    console.log("module01-fn02");
}

//暴露接口
module.exports = {
    "fn01":fn01,
    "fn02":fn02
}

 

二、使用接口

在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方法。

 

三、運行看效果

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

 

 

 

多個模塊的引用

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

一、咱們先將 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
}

二、咱們在 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的方法

三、執行test.js

便可看到兩個模塊的方法都被調用了,這裏咱們能夠看到,就算模塊中使用了一樣的方法,在使用的時候,因爲定義了不一樣的變量來接收,也不會互相影響,並且咱們要使用哪一個模塊就直接引用就能夠,這就是模塊兒化的優點。

 

模塊兒化暴露接口的另外一種方法

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

function fn01(){  //編寫一個方法 fn01
    console.log("module02-fn01");
}
function fn02(){  //編寫一個方法 fn02
    console.log("module02-fn02");
}

//暴露接口
exports.fn01 = fn01;
exports.fn02 = fn02;

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

 

 

fs文件操做模塊


讀取文件

node自帶文件操做模塊 fs,使用時只須要直接引入便可

首先建立文件 fs01.js  a.txt文件

編輯 a.txt。任意寫入點文字  (注意 編碼格式 修改成 utf-8,若是是默認格式,中文文字讀取的時候會是亂碼)

注:怎麼將a.txt,修改成utf-8格式

新建的txt文檔默認是ANSI格式,只需將txt另存爲,另存的時候修改右下角的格式設置便可。

 

編輯 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,  內部傳入三個參數  ,一、讀取的文件路徑 , 二、編碼格式, 三、回調函數,回調函數中有兩個參數  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方法有三個參數,一、寫入的文件路徑(若是沒有此文件,node會自動建立一個b.txt),二、須要寫入的數據(這裏咱們將從a.txt中讀取的數據 傳給 b.txt) , 三、回調函數,只有一個參數,當出現寫入錯誤的時候,會有錯誤提示 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方法有兩個參數,一、要刪除的路徑,二、回調函數,若是出現錯誤,會有err提示

修改 fs01.js內容爲上面代碼,而後執行 fs01.js,就能夠看到 b.txt被刪除了

 

建立文件夾

使用  mkdir  方法  ,該方法有兩個參數 一、文件夾名,二、回調函數,若是出現錯誤,會有err提示

修改 fs01.js內容爲下面代碼,而後執行 fs01.js,就能夠看到 在當前文件夾中建立了 名爲 c 的文件夾

var fs = require("fs"); //node 內置模塊可直接引入  fs:文件系統操做模塊

fs.mkdir("c",function(err){  //建立 c 文件
    if(err) throw err;
})

 

 

修改文件名/文件夾名

使用 remane,該方法有兩個參數 一、須要修改的文件名(當前目錄下),二、新的文件名,三、回調函數,若是出現錯誤,會有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方法建立服務,裏面只有一個參數(回調函數:表示請求發生的時候須要執行的代碼【回到函數有兩個參數,一、請求信息,二、相應信息】),

最後須要添加端口監聽  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的使用。

 

 

關注公衆號,博客更新便可收到推送

相關文章
相關標籤/搜索