第二章 建議學習時間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
那麼怎麼來實現模塊兒化呢?瀏覽器
咱們在本身的某個文件夾中(示例爲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的使用。
關注公衆號,博客更新便可收到推送