只在此山中,雲深不知處


聽首歌



© 2018 by Shawn Huang
Last Updated: 2018.5.27

Event

在電腦內每一個動作都是一個event,例如開啟檔案或是新增連結。物件可以觸發event,在node.js內有一個core module稱為events,可用來處理event。
>> node4_1.js
好像發射砲彈一樣,首先require events這個module,使用new關鍵字建立EventEmitter()物件<<發射器>>,使用關鍵字on來連結event名稱<<按鈕名稱>>與對應處理函數<<砲彈>>。然後使用emit函數<<按下按鈕>> 觸發事件。
>> node4_2.js
這個例子讓物件繼承events.EventEmitter使其成為EventEmitter物件,然後使用該物件來觸發事件。node.js的util module提供繼承的方法inherits,可以直接方便的使用。之後只要new新的物件,讓其on綁定事件處理方法,然後emit即可觸發。
繼承物件也可以使用JavaScript的方式。
>> node4_3_module.js

先寫一個module其中包含繼承自events.EventEmitter的物件,然後exports。
>> node4_3.js
將module導入後,使用其中的class建立物件,然後on跟emit來觸發。
接下來試著將其寫入到http server內。先再建立一個html檔案。
>> StormWindCity.html
將module修改如下。
>> node4_4_module.js
修改一下要導入的module。
>> node4_4.js
跟之前一樣導入後建立物件,僅在filename == "./StormWindCity.html"為true時emit,可以之前介紹過的使用nodemon node4_4.js指令,若有錯誤可以直接修改檔案,無須斷線重連。在http://localhost:3000/StormWindCity.html可以看到輸出結果。

Stream


使用fs內的readFile(writeFile)時,基本上是將所有資料讀入記憶體,然後一股腦兒進行下一步處理(callback),如果資料量很大的時候,可能會將所有資源耗費在其上,stream的資料傳輸方式則是讀取少量資料(chunk)至buffer,待buffer滿了之後便開始處理,等清空後再繼續讀取,這樣可以較有效率地將資料傳遞。在fs內提供WriteStream與ReadStream供我們使用。
>> node4_5.js
createReadStream會傳回一個fs.ReadStream物件,它是一種Readable Streams,每次一個chunk的資料轉移,便會emit事件。需要加上utf-8參數,否則顯示出來的為二進位碼。如果讀進來的資料想要寫進另一個檔案裡,則可以使用createWriteStream()。
>>
這是一個連續動作,讀進然後寫出,node.js提供串流指令pipe來串聯這整個系列動作。
>> node4_5_pipe.js
若是要將內容寫入http server內,可以使用readstream.pipe(res)指令來完成。
>> node4_5_httppipe.js
若是跟之前類似,要讀的檔案是html並要將其顯示出來(e.g. http://localhost:3000/StormWindCity.html),可以採取如下方式。
>> node4_5_httppipehtml.js