特點(diǎn):
(1)前后端都用js編寫容易實(shí)現(xiàn)全棧
(2)非阻塞 i/o (最重要)
(3)完善的生態(tài)
(4)使用v8引擎
劣勢:nodejs不適合計(jì)算密集型程序悼嫉,只適合 i/o 密集型程序
運(yùn)行node:(1)進(jìn)入到當(dāng)前文件所在路徑
(2)運(yùn)行node必須使用命令行,node+文件名字運(yùn)行
異步:代碼不是一行一行執(zhí)行的
回調(diào):當(dāng)做完一件事的時(shí)候兵钮,馬上反饋這件事
相對路徑:“.”或者“無”開頭的就是相對路徑
js創(chuàng)建對象:(1){a:1}
(2)var obj??= new Object();
(3)function bar(){
this.a = 3;
}
全局對象:可以直接調(diào)用的對象我們稱之為全局對象
1.console:可以調(diào)用log這個(gè)方法
2.setTimeout:超時(shí)調(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:展示下級(jí)所有
OS——官方為我們提供的文件 operation system操作系統(tǒng)
(1)使用官方為我們提供的js文件愿阐,需省略‘.js’后綴。
(2)不能以‘.’開頭趾疚,如果引用自己定義的文件缨历,路徑必須以‘.’開頭。
OS的作用:
node.js官方為我們提供有助于編程的文件糙麦,叫核心模塊戈二,都可以用require引用
(1)打印操作系統(tǒng),查看當(dāng)前node.js運(yùn)行的平臺(tái)是什么操作系統(tǒng)
console.log(os.platform());
(2)cpus:打印cpu參數(shù)和cpu核數(shù)
(3)hostname:打印主機(jī)名稱
(4)arch打印cpu架構(gòu)
核心模塊喳资!
1.process — 進(jìn)程:一個(gè)程序運(yùn)行起來就是進(jìn)程觉吭,有進(jìn)程就有進(jìn)程號(hào)
可以通過pid查看當(dāng)前node運(yùn)行的進(jìn)程號(hào)
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 — 引用時(shí)間模塊后节值,需創(chuàng)建監(jiān)聽發(fā)射事件的對象
使用事件需要映入時(shí)間模塊events徙硅,必須加s
使用事件必須創(chuàng)建EventEmitter這個(gè)對象,這里的Event沒有s搞疗,第一個(gè)字母大寫
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也是一個(gè)全局對象
②Buffer第一個(gè)字母大寫
③Buffer括號(hào)中的內(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ì)算機(jī)中任何數(shù)據(jù)傳輸都是通過流
在node.js中流是一個(gè) 抽象的接口,用來傳輸010101(二進(jìn)制)宛徊,其實(shí)就是數(shù)據(jù)
在nide.js中流這個(gè)抽象的接口出去的就是數(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é):
流是一個(gè)抽象的接口,包括讀流寫流和讀寫流在node.js中流不是字節(jié)流node.js中基本上不會(huì)自己創(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ì)算機(jī)中除了文件夾都是文件暖呕,在linux中,只有文件
fs模塊對文件的操作主要就是增刪改查
在node.js中任何對文件的操作都分為同步異步
①異步讀取文件 readFile()
第一個(gè)參數(shù)文件路徑苞氮,第二個(gè)參數(shù)是回調(diào)湾揽,注意在回調(diào)函數(shù)中有兩個(gè)參數(shù),第一個(gè)是error,第二個(gè)是獨(dú)到的數(shù)據(jù)
fs會(huì)把文件讀取到Buffer中
因?yàn)槟阋雈s這個(gè)模塊所以readFile()這個(gè)官方的方法已經(jīng)寫好了钝腺,作用就是讀取完的數(shù)據(jù)會(huì)自動(dòng)放到回調(diào)函數(shù)的data中如果有錯(cuò)誤會(huì)通過error報(bào)出
②同步讀取文件 readFileSync()
一個(gè)參數(shù)及文件路徑
③異步寫文件 writeFile()
第一個(gè)參數(shù)要寫入文件的路徑抛姑,第二個(gè)寫入文件的內(nèi)容赞厕,第三個(gè)回調(diào)函數(shù)艳狐,回調(diào)參數(shù)只有一個(gè)參數(shù)就是error
④同步寫文件 ?writeFileSync()
第一個(gè)參數(shù)路徑,第二個(gè)參數(shù)要寫的內(nèi)容
⑤異步追加文件內(nèi)容 ?appendFile()
第一個(gè)參數(shù)路徑皿桑,第二個(gè)參數(shù)內(nèi)容毫目,第三個(gè)參數(shù)回調(diào),回調(diào)參數(shù)是error
⑥同步追加文件內(nèi)容 appendFileSync()
第一個(gè)參數(shù)路徑诲侮,第二個(gè)參數(shù)是追加的內(nèi)容
⑦異步改變文件名 rename()
第一個(gè)參數(shù)是老名字镀虐,第二個(gè)參數(shù)是新名字,第三個(gè)參數(shù)是回調(diào)函數(shù)返回error
⑧同步改變文件名renameSync()
第一個(gè)參數(shù)是老名字沟绪,第二個(gè)參數(shù)是新名字
8.文件和流
一刮便、使用流讀取文件 createReadStream()
一個(gè)參數(shù)要讀文件的路徑
注意:該方法返回的是一個(gè)讀流
因?yàn)樽x流是繼承EventEmitter所以讀流on和emit事件
①使用讀流獲取數(shù)據(jù)需要用on且第一個(gè)參數(shù)為'data',不用emit觸發(fā)該事件绽慈,第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)且有一個(gè)參數(shù)則該參數(shù)是被讀文件的內(nèi)容
沒通過emit觸發(fā)事件卻調(diào)用了函數(shù)是因?yàn)槭褂玫膄s.createReadStream創(chuàng)建的流這個(gè)方法是官方定義的恨旱,所以當(dāng)讀流的時(shí)候就可以自動(dòng)觸發(fā)'data'事件,當(dāng)檢測文件有數(shù)據(jù)的時(shí)候回調(diào)函數(shù)的參數(shù)就是我們讀取的文件的內(nèi)容
②可以通過給createStream()添加選項(xiàng)來指定我們讀取字節(jié)的個(gè)數(shù)坝疼,選項(xiàng)是第二個(gè)參數(shù)搜贤,是一個(gè)js對象{start:起始位置,end:結(jié)束位置}
③還可以通過'end'事件來額外操作,該事件是在讀取完文檔后觸發(fā)钝凶,所以之前必須有'data'事件
總結(jié):說明讀流會(huì)自動(dòng)觸發(fā)兩個(gè)事件'data'和'end'
二仪芒、使用流寫文件 createWriteStream()
注意:該方法返回的是一個(gè)寫流
寫流通過write方法寫入內(nèi)容,方法的參數(shù)就是寫入的內(nèi)容
寫流通過end方法告訴文件所有內(nèi)容寫入完畢
注意不能在end方法后使用write方法會(huì)出錯(cuò)
全總結(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()
一個(gè)參數(shù):端口號(hào)
④使用connection事件
只要客戶端連接就會(huì)觸發(fā)這個(gè)事件
⑤將客戶端的client對象返回到createServer的參數(shù)中
⑥client是繼承流的所以可以讀流掂名,可以使用'data'事件
客戶端:
①引入模塊
②創(chuàng)建連接對象 createConnection()
兩個(gè)參數(shù),第一個(gè)是要連接的端口的端口號(hào)哟沫,第二個(gè)是要連接的主機(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)接收到回車時(shí)觸發(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()
④請求時(shí)要執(zhí)行的部分
在createServer中加上回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)就是我所要執(zhí)行的任務(wù)筑公,createServer的作用就是當(dāng)有請求?? ?? ? ? ? ? ?的時(shí)候雳窟,執(zhí)行function這里面的代碼。
回調(diào)函數(shù)有兩個(gè)參數(shù)都是對象
①req(request)用來請求對象? ? 繼承讀流
1.url? ? 表示請求的url地址
2.method? ? 請求方法(post,get封救,pnt拇涤,delete,update誉结,Head~~~)
②res(response)表示響應(yīng)對象? ? 繼承寫流
可以通過fs模塊引入html模塊輸入到網(wǎng)頁中
node js還有很多外部模塊后面會(huì)更新