nodejs學習筆記

模塊

  • 名詞解釋:每一個js文件就是一個模塊,而文件路徑就是模塊名。每個模塊(也就是每個js文件)都有requir,exports,module三個預先定義好的變量可供使用。
  • require,用于在當前模塊中加載使用別的模塊,傳入一個模塊名,返回一個模塊導出對象,模塊命中.js可省略。
var foo = requeire('./foo);
  • exports,是當前模塊的導出對象,用于導出模塊公有方法和屬性,require得到的模塊就是exports導出的對象。
exports.hello = function(){
console.log('hello world);
}#導出了一個公有方法
  • module,通過module對象可以訪問到當前模塊的一些相關信息,最多的用途事替換當前模塊的導出對象
module.exports = function(){
    console.log('hello world);
}#模塊默認導出對象被替換為一個函數

  • 名詞解釋:包就是多個子模塊構成的大模塊,并且所有的子模塊都放在同一個目錄里。一個包需要有一個入口模塊,入口模塊的導出對象被稱為包的導出對象。
  • index.js,入口文件名,文件名的特殊之處,在于加載模塊是可以使用其所在目錄的路徑代替模塊文件路徑。
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/index');
#也就是可以少寫一部分,使得看似加載了一個包,其實還是加載了一個入口模塊而已
  • package.json自定義入口模塊的文件名和存放位置
{
    "name":"cat",
    "main":"./lib/main.js"
}#這樣加載的時候就可以只寫包名,然后根據package的路徑去找入口模塊,注意存放的位置
假設包路徑'./user/cat'
package路徑'./user/cat/package.json'
  • 版本號X.Y.Z
    <p>X,主版本號;Y,次版本號;Z,補丁版本號
    <p>版本號更新規則:
如果只是修復bug->Z位
如果新增了功能,向下兼容->Y位
如果大的變動并且向下不兼容->X為

EventEmitter

node.js所有的異步I/O操作在完成時都會發送一個事件到時間隊列;node.js很多對象都會分發事件

  • EventEmitter類,events模塊只提供了一個類:events.EventEmitter,EventEmitter的核心就是事件觸發與實踐監聽器功能的封裝
var events = require('events');
var eventEmitter = new events.EventEmitter();
//用法
var event = new eventEmitter();類實例化
//注冊一個some_event的監聽器
event.on('some_event',function(){
    console.log('some event');
})
setTimeout(funtion(){
//發射某個事件
    event.emit('some_event');
})
  • error事件
  • 如果沒有設置error事件,程序會退出并輸出錯誤信息,所要要設置error事件,避免遇到錯誤后整個程序崩潰。

文件操作

  • 打開文件,fs.open(path,flags[,mode],callback)
    • path 文件路徑
    • flags 以何種方式打開 (r,r+,rs,rs+,w,wx...)
    • mode 設置文件權限,文件創建默認權限0666
    • callback 回調函數,帶兩個參數:callback(err,fd)
  • 獲取文件信息,fa.stat(path,callback)
    • path 文件路徑
    • callback(err,stats),stats是fs.Stats對象
    stats類中常用方法;
    stats.isFile()是否是文件
    stats.isDirectory()是否是目錄
    stats.isBlockDevice()是否是塊設備
    stats.isCharacterDevice()是否是字符設備
    stats.isSymbolicLink()是否是軟鏈接
    stats.isFIFO()是否是FIFO(是unix的一種特殊類型的命令管道)
    stats.isSocket()是否是Socket
    
  • 寫入文件, fs.writeFile(filename,data[,options],callback)
    • path,文件路徑
    • data 要寫入文件的數據,可以是String或Buffer(流)對象
    • options 對象,包含{encoding,mode,flag},默認編碼為utf8,模式0666,flag為'w'
    • callback(err),注意,只有一個參數
  • 讀取文件,fs.read(fd,buffer,offset,length,position,callback)
    • fd,通過fs.open()返回的文件描述符
    • buffer,數據寫入的緩沖區
    • offset,緩沖區寫入的寫入偏移量
    • length,要從文件中讀取的字節數
    • position,文件讀取的起始位置,如果position的值為null,則會從當前文件指針的位置讀取
    • callback(err,bytesRead,buffer),bytesRead表示讀取的字節數,buffer為緩沖區對象
  • 關閉文件,fs.close(fd,callback)
    • fd,通過fs.open()方法返回的文件描述符
    • callback()回調函數,沒有任何參數,可以自定義參數
  • 截取文件,fs.ftruncate(fd,len.callback)
    • fd,同上
    • len,文件內容的截取長度
    • callback,回調函數,沒有參數,可以自定義參數
  • 刪除文件,fs.unlink(path,callback)
    • path,同上
    • callback,回調函數,沒有參數
  • 創建目錄,fs.mkdir(path[,mode],callback)
    • path, 文件路徑
    • mode,目錄權限,默認為0777
    • callback, 回調函數,沒有參數
  • 讀取目錄,fs.readdir(path,callback)
    • path,文件路徑
    • callback(ree,files),files是目錄下的文件數組列表
  • 刪除目錄,fs.rmdir(path,callback)
    • path,文件路徑
    • callback,回調函數,沒有參數

其余的方法看文檔!


Buffer

  • 創建buffer類
    • var bin = new Buffer(參數),參數可以是數字,代表字節長度;參數可以是數組;參數可以是一個字符串,并且可以指定編碼方式,默認utf8
  • 寫入緩沖區,bin.write(string[,offset[,length]][,encoding]),返回實際寫入的大小,如果buffer空間不足,則只會寫入部分字符串
    • string,寫入緩沖區的字符串。
    • offset,緩沖區開始寫入的索引值。
    • length,寫入的字節數,默認為buffer.length
    • encoding,使用的編碼
  • 從緩沖區讀取數據 bin.toString([encoding[,start[,end]]])
    • encoding,使用的編碼
    • start,開始讀取的索引位置
    • end,結束位置
  • 將Buffer轉換為JSON對象bin.toJSON(),返回json對象
  • 緩沖區合并Buffer.concat(list[,totlaLength]),返回一個多個成員合并的心Buffer對象
    • list,用于合并的Buffer對象數組列表
    • totalLength,指定合并后Buffer對象的總長度
  • 緩沖區比較bin.compare(otherBuffer),返回值是一個數字,表示bin在otherBuffer之前之后或相同
  • 拷貝緩沖區bin.copy(targetBuffer[,targetStart[,sourceStart[,sourceEdnd]]])
    • targetBuffer,要拷貝的Buffer對象
    • targetStart,數字,可選,默認0
    • sourceStart,數字,可選,默認0
    • sourceEnd,數字,可選,默認buffer.length
  • 緩沖區剪裁bin.slice([start[,end]]),返回一個新的緩沖區,他和舊緩沖區指向同一塊內存
  • 緩沖區長度bin.length

其余的方法看文檔


Stream(數據流)(fs模塊)

  • Stream有四種數據類型
    • Readable,可讀操作
    • Writable,可寫操作
    • Duplex,可讀可寫操作
    • Transform,操作被寫入數據,然后讀出結果
  • 所有的Stream對象都是EventEmiiter的實例,常見的事件有
    • data,當有數據可讀時觸發
    • end,沒有更多的數據可讀時觸發
    • error,在接收和寫入過程中發生錯誤時觸發
    • finish,所有數據已被寫入到底層系統時觸發
  • 從流中讀取數據
var fs = require('fs');
var data = "";
//創建可讀流
var readerStream = fs.createReadStream('some.txt');
//設置編碼utf8
readerStream.setEncoding('UTF8')
//處理流事件
readerStream.on('data',function(chunk){
    data+=chunk;
})
  • 寫入流
//創建一個可以寫入的流
var writeStream = fs.createWirteStream('some.txt');
//使用utf8編碼寫入數據
writeSteam.write(data,'UTF8');
//標記文件末尾
writeStream.end()
//處理事件流
writeStream.on('finish',function(){
    console.log('write end');
})
  • 管道流
    • 管道提供了一個輸出流到輸入流的機制,通常我們用語從一個流中獲取數據并將數據傳遞到另外一個流中。適用于大文件的復制過程。
var fs = require('fs');
//創建可讀流
var readerStream = fs.createReadStream('some.txt');
//創建可寫流
var writeStream = fs.createWriteStream('another.txt');
//管道讀寫操作
readerStream.pipe(writeStream);
  • 鏈式流
    • 鏈式是通過連接輸出流到另外一個流并創建多個對個流操作鏈的機制,一般用于管道操作.
    var fs = require('fs');
    var zlib = require('zlib');
    //壓縮文件,從形式上看,鏈式流,就是不斷的pipe(操作)
    fs.createReadStream('some.txt').pipe(zlib.createGzip).pipe(fs.createWriteStream('some.txt.gz'));
    

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,356評論 0 6
  • 文件系統模塊是一個封裝了標準的 POSIX 文件 I/O 操作的集合。通過require('fs')使用這個模塊。...
    保川閱讀 795評論 0 0
  • Node.js 是單進程單線程應用程序,但是通過事件和回調支持并發,所以性能非常高。nodejs由以下模塊組成:引...
    麥子_FE閱讀 444評論 0 2
  • 以前學習C、OC、Swift、H5的時候都沒有留下痕跡,心里甚是遺憾,最近用Nodejs參與了一個web開發,果斷...
    逗留閱讀 428評論 0 2
  • fs模塊即文件系統,所有方法都有同步或異步形式,這里暫時只介紹異步方式; readFile() fs.readFi...
    JacobMa1996閱讀 261評論 0 1