特點(diǎn):
(1)前后端都用js編寫容易實(shí)現(xiàn)全棧
(2)非阻塞 i/o (最重要)
(3)完善的生態(tài)
(4)使用v8引擎
劣勢:nodejs不適合計算密集型程序,只適合 i/o 密集型程序
運(yùn)行node:(1)進(jìn)入到當(dāng)前文件所在路徑
(2)運(yùn)行node必須使用命令行,node+文件名字運(yùn)行
異步:代碼不是一行一行執(zhí)行的
回調(diào):當(dāng)做完一件事的時候,馬上反饋這件事
相對路徑:“.”或者“無”開頭的就是相對路徑
js創(chuàng)建對象:(1){a:1}
(2)var obj??= new Object();
(3)function bar(){
this.a = 3;
}
全局對象:可以直接調(diào)用的對象我們稱之為全局對象
1.console:可以調(diào)用log這個方法
2.setTimeout:超時調(diào)用
3.setInterval:間歇調(diào)用
4._ _dirname:當(dāng)前文件所在路徑
5._ _filename:當(dāng)前文件的路徑包括文件名
6.require:require的參數(shù)就是exports曝光文件的相對路徑 ?require('./index.js');
7.exports:曝光,曝光后的變量別的文件就可以使用require引用
使用exports曝光變量必須加上屬性,屬性名可以自擬,然后可以曝光給其他文件,對象的鍵是屬性名,值是曝光變量的值
(1)曝光變量(2)曝光對象(3)曝光方法(4)曝光構(gòu)造函數(shù)
(5)曝光工廠函數(shù):使用new Object創(chuàng)建對象,返回值,返回的是創(chuàng)建的對象
8.module:module和exports一起使用,exports可以作為module的屬性
可以不添加屬性,使用require引用
(1)pwd:顯示當(dāng)前路徑??(2)cd:切換??(3)ls:展示下級所有
OS——官方為我們提供的文件 operation system操作系統(tǒng)
(1)使用官方為我們提供的js文件,需省略‘.js’后綴。
(2)不能以‘.’開頭,如果引用自己定義的文件,路徑必須以‘.’開頭。
OS的作用:
node.js官方為我們提供有助于編程的文件,叫核心模塊,都可以用require引用
(1)打印操作系統(tǒng),查看當(dāng)前node.js運(yùn)行的平臺是什么操作系統(tǒng)
console.log(os.platform());
(2)cpus:打印cpu參數(shù)和cpu核數(shù)
(3)hostname:打印主機(jī)名稱
(4)arch打印cpu架構(gòu)
核心模塊!
1.process — 進(jìn)程:一個程序運(yùn)行起來就是進(jìn)程,有進(jìn)程就有進(jìn)程號
可以通過pid查看當(dāng)前node運(yùn)行的進(jìn)程號
2.util — untility(工具)
可以格式化我們的字符串
(1)format:%d表示數(shù)字???%s表示字符串
(2)util:可以查看屬性和方法明細(xì),通過inspect。
(3)depth:打印到第幾層????????console.log(util.inspect(util,{depth:1 } ) );
3.path — 用來操作路徑
1.parse 解析路徑
(1)root:根目錄
(2)dir:當(dāng)前文件所在的目錄
(3)base:當(dāng)前文件的帶有擴(kuò)展名的文件名
(4)ext:擴(kuò)展名
(5)name:文件名
2.join 合并路徑
join里面的參數(shù)可以是路徑和文件的名字
3.isAbsolute是否絕對路徑
它的返回值是布爾值,如果true為絕對路徑,否則為相對路徑
4.extname — 得到文件的擴(kuò)展名
4.events — 引用時間模塊后,需創(chuàng)建監(jiān)聽發(fā)射事件的對象
使用事件需要映入時間模塊events,必須加s
使用事件必須創(chuàng)建EventEmitter這個對象,這里的Event沒有s,第一個字母大寫
var em = new event.EventEmitter;
(1)on 監(jiān)聽事件方法
(2)emit 用來觸發(fā)事件
(3)once 只監(jiān)聽一次
5.Buffer
①就是緩存,存數(shù)據(jù),存比較大的數(shù)據(jù)
②存放的為二進(jìn)制的數(shù)據(jù)
③Buffer的數(shù)據(jù)存在主機(jī)內(nèi)存中,內(nèi)存多大可以存多大
創(chuàng)建Buffer
1.使用new創(chuàng)建?????var buf = new Buffer();
①Buffer也是一個全局對象
②Buffer第一個字母大寫
③Buffer括號中的內(nèi)容為Buffer的大小,單位字節(jié)
2.使用字符串創(chuàng)建
var buf = new Buffer(‘hello’);
console.log(buf.toString());
toString();可以把它打印成字符串
3.使用數(shù)組創(chuàng)建
var buf = new Buffer([1,3]);
6.流(stream)
在計算機(jī)中任何數(shù)據(jù)傳輸都是通過流
在node.js中流是一個 抽象的接口,用來傳輸010101(二進(jìn)制),其實(shí)就是數(shù)據(jù)
在nide.js中流這個抽象的接口出去的就是數(shù)據(jù)流
在node.js中流(stream)也是核心模塊
可以把stream看成Event.Emitter的子類
因?yàn)閞equire('stream')曝光的是構(gòu)造方法,所以需要new創(chuàng)建對象
流的方向:在node.js中流是有方向的是相對于cpu分為讀流和寫流
創(chuàng)建讀流:Readable
創(chuàng)建寫流:Writable
創(chuàng)建讀寫流:Duplex
總結(jié):
流是一個抽象的接口,包括讀流寫流和讀寫流在node.js中流不是字節(jié)流node.js中基本上不會自己創(chuàng)建流,都是使用其它模塊為我們創(chuàng)建好的流
小結(jié)總結(jié):
核心模塊:os ?process ?path ?events ?util ?stream
全局對象:console ?__dirname ?__filename setTimeout setIntval module exports require
7.文件模塊(fs【file system】)
文件模塊是任何語言都很重要的模塊
在計算機(jī)中除了文件夾都是文件,在linux中,只有文件
fs模塊對文件的操作主要就是增刪改查
在node.js中任何對文件的操作都分為同步異步
①異步讀取文件 readFile()
第一個參數(shù)文件路徑,第二個參數(shù)是回調(diào),注意在回調(diào)函數(shù)中有兩個參數(shù),第一個是error,第二個是獨(dú)到的數(shù)據(jù)
fs會把文件讀取到Buffer中
因?yàn)槟阋雈s這個模塊所以readFile()這個官方的方法已經(jīng)寫好了,作用就是讀取完的數(shù)據(jù)會自動放到回調(diào)函數(shù)的data中如果有錯誤會通過error報出
②同步讀取文件 readFileSync()
一個參數(shù)及文件路徑
③異步寫文件 writeFile()
第一個參數(shù)要寫入文件的路徑,第二個寫入文件的內(nèi)容,第三個回調(diào)函數(shù),回調(diào)參數(shù)只有一個參數(shù)就是error
④同步寫文件 ?writeFileSync()
第一個參數(shù)路徑,第二個參數(shù)要寫的內(nèi)容
⑤異步追加文件內(nèi)容 ?appendFile()
第一個參數(shù)路徑,第二個參數(shù)內(nèi)容,第三個參數(shù)回調(diào),回調(diào)參數(shù)是error
⑥同步追加文件內(nèi)容 appendFileSync()
第一個參數(shù)路徑,第二個參數(shù)是追加的內(nèi)容
⑦異步改變文件名 rename()
第一個參數(shù)是老名字,第二個參數(shù)是新名字,第三個參數(shù)是回調(diào)函數(shù)返回error
⑧同步改變文件名renameSync()
第一個參數(shù)是老名字,第二個參數(shù)是新名字
8.文件和流
一、使用流讀取文件 createReadStream()
一個參數(shù)要讀文件的路徑
注意:該方法返回的是一個讀流
因?yàn)樽x流是繼承EventEmitter所以讀流on和emit事件
①使用讀流獲取數(shù)據(jù)需要用on且第一個參數(shù)為'data',不用emit觸發(fā)該事件,第二個參數(shù)是一個回調(diào)函數(shù)且有一個參數(shù)則該參數(shù)是被讀文件的內(nèi)容
沒通過emit觸發(fā)事件卻調(diào)用了函數(shù)是因?yàn)槭褂玫膄s.createReadStream創(chuàng)建的流這個方法是官方定義的,所以當(dāng)讀流的時候就可以自動觸發(fā)'data'事件,當(dāng)檢測文件有數(shù)據(jù)的時候回調(diào)函數(shù)的參數(shù)就是我們讀取的文件的內(nèi)容
②可以通過給createStream()添加選項(xiàng)來指定我們讀取字節(jié)的個數(shù),選項(xiàng)是第二個參數(shù),是一個js對象{start:起始位置,end:結(jié)束位置}
③還可以通過'end'事件來額外操作,該事件是在讀取完文檔后觸發(fā),所以之前必須有'data'事件
總結(jié):說明讀流會自動觸發(fā)兩個事件'data'和'end'
二、使用流寫文件 createWriteStream()
注意:該方法返回的是一個寫流
寫流通過write方法寫入內(nèi)容,方法的參數(shù)就是寫入的內(nèi)容
寫流通過end方法告訴文件所有內(nèi)容寫入完畢
注意不能在end方法后使用write方法會出錯
全總結(jié):讀流兩事件,寫流兩方法
readFile和createReadStream的區(qū)別
文件是當(dāng)前所有內(nèi)容讀取完后操作
流是對文件中的字節(jié)操作
比如:在流中專門提供了{(lán)start:"起始位置",end:"結(jié)束位置"}的方法對文件內(nèi)容進(jìn)行邊讀邊截取
但是在文件中需要先把文件內(nèi)容全部獲取然后在通過字符串的方法進(jìn)行截取
服務(wù)器端:
① 引入模塊
②創(chuàng)建服務(wù)器端對象
createServer()
③監(jiān)聽
listen()
一個參數(shù):端口號
④使用connection事件
只要客戶端連接就會觸發(fā)這個事件
⑤將客戶端的client對象返回到createServer的參數(shù)中
⑥client是繼承流的所以可以讀流,可以使用'data'事件
客戶端:
①引入模塊
②創(chuàng)建連接對象 createConnection()
兩個參數(shù),第一個是要連接的端口的端口號,第二個是要連接的主機(jī)的ip地址(本機(jī):127.0.0.1或者localhost)
③使用connect事件
④client是繼承流的所以可以寫流,可以使用write方法書寫文本
10、readline? ? 逐行讀取
獲取當(dāng)前輸入的內(nèi)容,需要進(jìn)程模塊輔助創(chuàng)建readline對象
var? ? rd=new readline.createInterface({input:p.stdin,output:p.stdout})
監(jiān)聽line事件,該事件是當(dāng)接收到回車時觸發(fā)
11、url? ? 網(wǎng)址? ? 統(tǒng)一資源定位符? ? (unit resouny location)
①url.parse()? ??打印網(wǎng)址的詳細(xì)信息(參數(shù)是網(wǎng)址)
12、querystring? ? 查詢字符串
①qs.parse()? ? 用來將a=b這種格式解析成{a:b}
13、http? ? (超文本傳輸協(xié)議:hyper? ? text? ? transfer? ? protocal)
①引入http模塊
②創(chuàng)建http對象
createServer()
③監(jiān)聽端口
listen()
④請求時要執(zhí)行的部分
在createServer中加上回調(diào)函數(shù),這個回調(diào)函數(shù)就是我所要執(zhí)行的任務(wù),createServer的作用就是當(dāng)有請求?? ?? ? ? ? ? ?的時候,執(zhí)行function這里面的代碼。
回調(diào)函數(shù)有兩個參數(shù)都是對象
①req(request)用來請求對象? ? 繼承讀流
1.url? ? 表示請求的url地址
2.method? ? 請求方法(post,get,pnt,delete,update,Head~~~)
②res(response)表示響應(yīng)對象? ? 繼承寫流
可以通過fs模塊引入html模塊輸入到網(wǎng)頁中
node js還有很多外部模塊后面會更新