標籤: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建立服務模組