NodeJs(尚硅谷视频学习笔记)
內容來自尚硅谷Nodejs學習課件以及自己添加
課前預熱:CMD基本知識
1.命令行窗口(小黑屏)、CMD窗口、終端、shell
- 開始菜單 --> 運行 --> CMD --> 回車 - Win + R --> CMD --> 回車 - 常用的指令dir 列出當前目錄下的所有文件cd 目錄名 進入到指定的目錄md 目錄名 創建一個文件夾rd 目錄名 刪除一個文件夾 -目錄. 表示當前目錄.. 表示上一級目錄 -環境變量(window系統中的變量 )PATH 一個個的路徑C:\Program Files\Microsoft SQL Server\130\Tools\Binn\- 當我們在命令行窗口打開一個文件,或調用一個程序時,系統會首先在當前目錄下尋找文件程序,如果找到了則直接打開如果沒有找到則會依次到環境變量path的路徑中尋找,直到找到為止如果沒找到則報錯類似于作用域鏈-所以我們可以將一些經常需要訪問的程序和文件的路徑添加到path中,這樣我們就可以在任意位置來訪問這些文件和程序了2.進程和線程
進程- 進程負責為程序的運行提供必備的環境- 進程就相當于工廠中的車間線程- 線程是計算機中最小的計算單位,線程負責執行進程中的程序- 線程就相當于工廠中的工人 單線程JS是單線程,在執行JS代碼的時候網頁是停止渲染的。 多線程主流的語言,如JavaNode.js簡介
? Node.js是一個能夠在服務器端運行JavaScript的開放源代碼、跨平臺JavaScript運行環境。
? Node采用Google開發的V8引擎運行js代碼,使用事件驅動、非阻塞和異步I/O模型等技術來提高性能,可優化應用程序的傳輸量和規模。
? Node大部分基本模塊都用JavaScript編寫。在Node出現之前,JS通常作為客戶端程序設計語言使用,以JS寫出的程序常在用戶的瀏覽器上運行。
? 目前,Node已被IBM、Microsoft、Yahoo!、Walmart、Groupon、SAP、 LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企業采用。
? Node主要用于編寫像Web服務器一樣的網絡應用,這和PHP和Python是類似的。
? 但是Node與其他語言最大的不同之處在于,PHP等語言是阻塞的而Node是非阻塞的。
? Node是事件驅動的。開發者可以在不使用線程的情況下開發出一個能夠承載高并發的服務器。其他服務器端語言難以開發高并發應用,而且即使開發出來,性能也不盡人意。
? Node正是在這個前提下被創造出來。
? Node把JS的易學易用和Unix網絡編程的強大結合到了一起。
? Node.js允許通過JS和一系列模塊來編寫服務器端應用和網絡相關的應用。
? 核心模塊包括文件系統I/O、網絡(HTTP、TCP、UDP、DNS、TLS/SSL等)、二進制數據流、加密算法、數據流等等。Node模塊的API形式簡單,降低了編程的復雜度。
? 使用框架可以加速開發。常用的框架有Express.js、Socket.IO和Connect等。Node.js的程序可以在Microsoft Windows、Linux、Unix、Mac OS X等服務器上運行。
? Node.js也可以使用CoffeeScript、TypeScript、Dart語言,以及其他能夠編譯成JavaScript的語言編程。
Node的用途
? Web服務API,比如REST
? 實時多人游戲
? 后端的Web服務,例如跨域、服務器端的請求
? 基于Web的應用
? 多客戶端的通信,如即時通信
簡介總結
I/O (Input/Output)- I/O操作指的是對磁盤的讀寫操作Node- Node是對ES標準一個實現,Node也是一個JS引擎- 通過Node可以使js代碼在服務器端執行- Node僅僅對ES標準進行了實現,所以在Node中不包含DOM 和 BOM - Node中可以使用所有的內建對象String Number Boolean Math Date RegExp Function Object Array而BOM和DOM都不能使用但是可以使用 console 也可以使用定時器(setTimeout() setInterval())- Node可以在后臺來編寫服務器Node編寫服務器都是單線程的服務器- 進程- 進程就是一個一個的工作計劃(工廠中的車間)- 線程- 線程是計算機最小的運算單位(工廠中的工人)線程是干活的- 傳統的服務器都是多線程的- 每進來一個請求,就創建一個線程去處理請求- Node的服務器單線程的- Node處理請求時是單線程,但是在后臺擁有一個I/O線程池在VScode中調出終端查看node.js代碼執行
使用快捷鍵: ctrl + ·
COMMONJS規范
ECMAScript標準的缺陷
? 沒有模塊系統
? 標準庫較少
? 沒有標準接口
? 缺乏管理系統
模塊化
? 如果程序設計的規模達到了一定程度,則必須對其進行模塊化。
? 模塊化可以有多種形式,但至少應該提供能夠將代碼分割為多個源文件的機制。
? CommonJS 的模塊功能可以幫我們解決該問題。
CommonJS規范
? CommonJS規范的提出,主要是為了彌補當前JavaScript沒有模塊化標準的缺陷。
? CommonJS規范為JS指定了一個美好的愿景,希望JS能夠在任何地方運行。
? CommonJS對模塊的定義十分簡單:
– 模塊引用
– 模塊定義
– 模塊標識
模塊引用
? 在規范中,定義了require()方法,這個方法接手模塊標識,以此將一個模塊引入到當前運行環境中。
? 模塊引用的示例代碼:
– var math = require(‘math’);
模塊定義
? 在運行環境中,提供了exports對象用于導出當前模塊的方法或者變量,并且它是唯一的導出的出口。
? 在模塊中還存在一個module對象,它代表模塊自身,而exports是module的屬性。
? 在Node中一個文件就是一個模塊。
exports.xxx = function() {}; module.exports = {};模塊標識
? 模塊標識其實就是模塊的名字,也就是傳遞給require()方法的參數,它必須是符合駝峰命名法的字符串,或者是以.、…開頭的相對路徑、或者絕對路徑。
? 模塊的定義十分簡單,接口也十分簡潔。每個模塊具有獨立的空間,它們互不干擾,在引用時也顯得干凈利落。
模塊化總結
模塊化- 在Node中,一個js文件就是一個模塊- 在Node中,每一個js文件中的js代碼都是獨立運行在一個函數中而不是全局作用域,所以一個模塊的中的變量和函數在其他模塊中無法訪問03module.js//引入其他的模塊 /* 在node中,通過require()函數來引入外部的模塊require()可以傳遞一個文件的路徑作為參數,node將會自動根據該路徑來引入外部模塊這里路徑,如果使用相對路徑,必須以.或..開頭使用require()引入模塊以后,該函數會返回一個對象,這個對象代表的是引入的模塊我們使用require()引入外部模塊時,使用的就是模塊標識,我們可以通過模塊標識來找到指定的模塊 - 模塊分成兩大類核心模塊- 由node引擎提供的模塊- 核心模塊的標識就是,模塊的名字- 示例:var fs = require("fs");文件模塊- 由用戶自己創建的模塊- 文件模塊的標識就是文件的路徑(絕對路徑,相對路徑)相對路徑使用.或..開頭*/ //var md = require("./02.module"); var math = require("./math"); var fs = require("fs");//console.log(md); console.log(math.add(123,456)); //console.log(fs);02module.js /* 我們可以通過 exports 來向外部暴露變量和方法 只需要將需要暴露給外部的變量或方法設置為exports的屬性即可 */ //向外部暴露屬性或方法 exports.x = "我是02.module.js中的x"; exports.y = "我是y"; exports.fn = function () {};04module.js /* 在node中有一個全局對象 global,它的作用和網頁中window類似在全局中創建的變量都會作為global的屬性保存在全局中創建的函數都會作為global的方法保存當node在執行模塊中的代碼時,它會首先在代碼的最頂部,添加如下代碼function (exports, require, module, __filename, __dirname) {在代碼的最底部,添加如下代碼}實際上模塊中的代碼都是包裝在一個函數中執行的,并且在函數執行時,同時傳遞進了5個實參exports- 該對象用來將變量或函數暴露到外部require- 函數,用來引入外部的模塊module- module代表的是當前模塊本身- exports就是module的屬性- 既可以使用 exports 導出,也可以使用module.exports導出__filenameC:\Users\lilichao\WebstormProjects\class0705\01.node\04.module.js- 當前模塊的完整路徑__dirnameC:\Users\lilichao\WebstormProjects\class0705\01.node- 當前模塊所在文件夾的完整路徑*/ //console.log(global.a); /*arguments.callee- 這個屬性保存的是當前執行的函數對象 */ //console.log(arguments.callee + ""); //console.log(arguments.length);//console.log(exports); //console.log(module.exports == exports);console.log(__dirname);05module.js /* exports 和 module.exports- 通過exports只能使用.的方式來向外暴露內部變量exports.xxx = xxx- 而module.exports既可以通過.的形式,也可以直接賦值module.exports.xxx = xxxxmodule.exports = {}*/Node的模塊實現
? Node中雖然使用的是CommonJS規范,但是其自身也對規范做了一些取舍。
? 在Node中引入模塊,需要經歷如下3個步驟:
– 路徑分析
– 文件定位
– 編譯執行
? 在Node中,模塊分為三類:一類是底層由C++編寫的內建模塊,一類是Node提供的核心模塊;還有一類是用戶編寫的模塊,稱為文件模塊。
包 package
? CommonJS的包規范允許我們將一組相關的模塊組合到一起,形成一組完整的工具。
? CommonJS的包規范由包結構和包描述文件兩個部分組成。
? 包結構
– 用于組織包中的各種文件
? 包描述文件
– 描述包的相關信息,以供外部讀取分析
包結構
? 包實際上就是一個壓縮文件,解壓以后還原為目錄。符合規范的目錄,應該包含如下文件:
– package.json 描述文件
– bin 可執行二進制文件
– lib js代碼
– doc 文檔
– test 單元測試
包描述文件
? 包描述文件用于表達非代碼相關的信息,它是一個JSON格式的文件 – package.json,位于包的根目錄下,是包的重要組成部分。
? package.json中的字段
– name、description、version、keywords、maintainers、contributors、bugs、licenses、repositories、dependencies、homepage、os、cpu、engine、builtin、directories、implements、scripts、author、bin、main、devDependencies。
在JSON文件不能寫注釋
NPM(Node Package Manager)
? CommonJS包規范是理論,NPM是其中一種實踐。
? 對于Node而言,NPM幫助其完成了第三方模塊的發布、安裝和依賴等。借助NPM,Node與第三方模塊之間形成了很好的一個生態系統。
NPM命令
? npm –v
– 查看版本
? npm
– 幫助說明
? npm search 包名
– 搜索模塊包
? npm install
–下載當前項目所依賴的包
? npm install 包名
– 在當前目錄安裝包
? npm install 包名 –g
– 全局模式安裝包(全局安裝的包一般都是一些工具)
? npm remove 包名
– 刪除一個模塊
? npm install 包名 --save
– 安裝包并添加到依賴中
? npm install 文件路徑
– 從本地安裝
? npm install 包名 –registry=地址
– 從鏡像源安裝
? npm config set registry 地址
– 設置鏡像源
NPM總結筆記
/*通過npm下載的包都放到node_modules文件夾中我們通過npm下載的包,直接通過包名引入即可node在使用模塊名字來引入模塊時,它會首先在當前目錄的node_modules中尋找是否含有該模塊如果有則直接使用,如果沒有則去上一級目錄的node_modules中尋找如果有則直接使用,如果沒有則再去上一級目錄尋找,直到找到為止直到找到磁盤的根目錄,如果依然沒有,則報錯*/Buffer(緩沖區)
? 從結構上看Buffer非常像一個數組,它的元素為16進制的兩位數。
JS數組性能比其他語言的數組差
? 實際上一個元素就表示內存中的一個字節。
? 實際上Buffer中的內存不是通過JavaScript分配的,而是在底層通過C++申請的。
? 也就是我們可以直接通過Buffer來創建內存中的空間。
Buffer的操作
? 使用Buffer保存字符串
let str = "你好 atguigu"; let buf = Buffer.from(str , "utf-8");? 創建指定大小的Buffer對象
let buf3 = Buffer.alloc(1024*8)Buffer的轉換
Buffer與字符串間的轉換
– 支持的編碼:
? ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex
– 字符串轉Buffer
? Buffer.from(str , [encoding]);
– Buffer轉字符串
? buf.toString([encoding] , [start] , [end]);
寫入操作
? 向緩沖區中寫入字符串
– buf.write(string[, offset[, length]][, encoding])
? 替換指定索引位置的數據
– buf[index]
? 將指定值填入到緩沖區的指定位置
– buf.fill(value[, offset[, end]][, encoding])
讀取操作
? 將緩沖區中的內容,轉換為一個字符串返回
– buf.toString([encoding[, start[, end]]])
? 讀取緩沖區指定索引的內容
– buf[index]
其他操作
? 復制緩沖區
– buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
? 對緩沖區切片
– buf.slice([start[, end]])
? 拼接緩沖區
– Buffer.concat(list[, totalLength])
Buffer總結筆記
/*Buffer(緩沖區)- Buffer的結構和數組很像,操作的方法也和數組類似- 數組中不能存儲二進制的文件,而buffer就是專門用來存儲二進制數據- 使用buffer不需要引入模塊,直接使用即可- 在buffer中存儲的都是二進制數據,但是在顯示時都是以16進制的形式顯示buffer中每一個元素的范圍是從00 - ff 0 - 25500000000 - 11111111計算機 一個0 或一個1 我們稱為1位(bit)8bit = 1byte(字節)1024byte = 1kb1024kb = 1mb1024mb = 1gb1024gb = 1tbbuffer中的一個元素,占用內存的一個字節- Buffer的大小一旦確定,則不能修改,Buffer實際上是對底層內存的直接操作*/var str = "Hello 尚硅谷";//將一個字符串保存到buffer中 var buf = Buffer.from(str); //創建一個指定大小的buffer //buffer構造函數都是不推薦使用的 //var buf2 = new Buffer(10);//10個字節的buffer //console.log(buf2.length);//創建一個10個字節的buffer var buf2 = Buffer.alloc(10); //通過索引,來操作buf中的元素 buf2[0] = 88; buf2[1] = 255; buf2[2] = 0xaa; buf2[3] = 255;//只要數字在控制臺或頁面中輸出一定是10進制 //console.log(buf2[2].toString(16));/*for(var i=0 ; i<buf2.length ; i++){console.log(buf2[i]); }*///Buffer.allocUnsafe(size) 創建一個指定大小的buffer,但是buffer中可能含有敏感數據 /*var buf3 = Buffer.allocUnsafe(10); console.log(buf3);*//*Buffer.from(str) 將一個字符串轉換為bufferBuffer.alloc(size) 創建一個指定大小的BufferBuffer.alloUnsafe(size) 創建一個指定大小的Buffer,但是可能包含敏感數據buf.toString() 將緩沖區中的數據轉換為字符串*/var buf4 = Buffer.from("我是一段文本數據");console.log(buf4.toString());fs(文件系統)
? 在Node中,與文件系統的交互是非常重要的,服務器的本質就將本地的文件發送給遠程的客戶端
? Node通過fs模塊來和文件系統進行交互
? 該模塊提供了一些標準文件訪問API來打開、讀取、寫入文件,以及與其交互。
? 要使用fs模塊,首先需要對其進行加載
– const fs = require("fs");
同步和異步調用
? fs模塊中所有的操作都有兩種形式可供選擇同步和異步。
? 同步文件系統會阻塞程序的執行,也就是除非操作完畢,否則不會向下執行代碼。
? 異步文件系統不會阻塞程序的執行,而是在操作完成時,通過回調函數將結果返回。
打開和關閉文件
? 打開文件
– fs.open(path, flags[, mode], callback) – fs.openSync(path, flags[, mode])? 關閉文件
– fs.close(fd, callback) – fs.closeSync(fd)打開狀態
寫入文件
? fs中提供了四種不同的方式將數據寫入文件
– 簡單文件寫入
– 同步文件寫入
– 異步文件寫入
– 流式文件寫入
簡單文件寫入
? fs.writeFile(file, data[, options], callback)
? fs.writeFileSync(file, data[, options])
? 參數:
– file 文件路徑
– data 被寫入的內容,可以是String或Buffer
– options 對象,包含屬性(encoding、mode、flag)
– callback 回調函數
同步文件寫入
? fs.writeSync(fd, buffer, offset, length[, position])
? fs.writeSync(fd, data[, position[, encoding]])
? 要完成同步寫入文件,先需要通過openSync()打開文件來獲取一個文件描述符,然后在通過writeSync()寫入文件。
? 參數
– fd 文件描述符,通過openSync()獲取
– data 要寫入的數據(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長度
– position 寫入的起始位置
– encoding 寫入編碼
異步文件寫入
? fs.write(fd, buffer, offset, length[, position], callback)
? fs.write(fd, data[, position[, encoding]], callback)
? 要使用異步寫入文件,先需要通過open()打開文件,然后在回調函數中通過write()寫入。
? 參數:
– fd 文件描述符
– data 要寫入的數據(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長度
– position 寫入的起始位置
– encoding 寫入編碼
流式文件寫入
? 往一個文件中寫入大量數據時,最好的方法之一是使用流。
? 若要將數據異步傳送到文件,首需要使用以下語法創建一個Writable對象:
– fs.createWriteStream(path[, options])
? path 文件路徑
? options {encoding:"",mode:"",flag:""}
? 一旦你打開了Writable文件流,就可以使用write()方法來寫入它,寫入完成后,在調用end()方法來關閉流。
讀取文件
? fs中提供了四種讀取文件的方式
– 簡單文件讀取
– 同步文件讀取
– 異步文件讀取
– 流式文件讀取
簡單文件讀取
? fs.readFile(file[, options], callback)
? fs.readFileSync(file[, options])
– 參數:
? file 文件路徑或文件描述符
同步文件讀取
? fs.readSync(fd, buffer, offset, length, position)
– 參數:
? fd 文件描述符
? buffer 讀取文件的緩沖區
? offset buffer的開始寫入的位置
? length 要讀取的字節數
? position 開始讀取文件的位置
異步文件讀取
? fs.read(fd, buffer, offset, length, position, callback)
– 參數:
? fd 文件描述符
? buffer 讀取文件的緩沖區
? offset buffer的開始寫入的位置
? length 要讀取的字節數
? position 開始讀取文件的位置
? callback 回調函數 參數err , bytesRead , buffer
流式文件讀取
? 從一個文件中讀取大量的數據時,最好的方法之一就是流式讀取,這樣將把一個文件作為Readable流的形式打開。
? 要從異步從文件傳輸數據,首先需要通過以下語法創建一個Readable流對象:
– fs.createReadStream(path[, options])
? path 文件路徑
? options {encoding:"",mode:"",flag:""}
? 當你打開Readable文件流以后,可以通過readable事件和read()請求,或通過data事件處理程序輕松地從它讀出。
其他操作
? 驗證路徑是否存在
– fs.exists(path,callback)
– fs.existsSync(path)
? 獲取文件信息
– fs.stat(path, callback)
– fs.statSync(path)
? 刪除文件
– fs.unlink(path, callback)
– fs.unlinkSync(path)
? 列出文件
– fs.readdir(path[, options], callback)
– fs.readdirSync(path[, options])
? 截斷文件
– fs.truncate(path, len, callback)
– fs.truncateSync(path, len)
? 建立目錄
– fs.mkdir(path[, mode], callback)
– fs.mkdirSync(path[, mode])
? 刪除目錄
– fs.rmdir(path, callback)
– fs.rmdirSync(path)
? 重命名文件和目錄
– fs.rename(oldPath, newPath, callback)
– fs.renameSync(oldPath, newPath)
? 監視文件更改寫入
– fs.watchFile(filename[, options], listener)
fs總結筆記
/*文件系統(File System)- 文件系統簡單來說就是通過Node來操作系統中的文件- 使用文件系統,需要先引入fs模塊,fs是核心模塊,直接引入不需要下載同步文件的寫入- 手動操作的步驟1.打開文件fs.openSync(path, flags[, mode])- path 要打開文件的路徑- flags 打開文件要做的操作的類型r 只讀的w 可寫的- mode 設置文件的操作權限,一般不傳返回值:- 該方法會返回一個文件的描述符作為結果,我們可以通過該描述符來對文件進行各種操作2.向文件中寫入內容fs.writeSync(fd, string[, position[, encoding]])- fd 文件的描述符,需要傳遞要寫入的文件的描述符- string 要寫入的內容- position 寫入的起始位置- encoding 寫入的編碼,默認utf-83.保存并關閉文件fs.closeSync(fd)- fd 要關閉的文件的描述符*/ var fs = require("fs");//打開文件 var fd = fs.openSync("hello.txt" , "w");//向文件中寫入內容 fs.writeSync(fd , "今天天氣真不錯~~~", 2);//關閉文件 fs.closeSync(fd);console.log("程序向下執行~~~"); /**異步文件寫入fs.open(path, flags[, mode], callback)- 用來打開一個文件- 異步調用的方法,結果都是通過回調函數的參數返回的- 回調函數兩個參數:err 錯誤對象,如果沒有錯誤則為nullfd 文件的描述符fs.write(fd, string[, position[, encoding]], callback)- 用來異步寫入一個文件fs.close(fd, callback)- 用來關閉文件*///引入fs模塊 var fs = require("fs");//打開文件 fs.open("hello2.txt","w",function (err , fd) {//判斷是否出錯if(!err){//如果沒有出錯,則對文件進行寫入操作fs.write(fd,"這是異步寫入的內容",function (err) {if(!err){console.log("寫入成功~~");}//關閉文件fs.close(fd , function (err) {if(!err){console.log("文件已關閉~~~");}});});}else{console.log(err);} });console.log("程序向下執行~~~"); /*簡單文件寫入fs.writeFile(file, data[, options], callback)fs.writeFileSync(file, data[, options])- file 要操作的文件的路徑- data 要寫入的數據- options 選項,可以對寫入進行一些設置- callback 當寫入完成以后執行的函數- flagr 只讀w 可寫a 追加*/ //引入fs模塊 var fs = require("fs");/*fs.writeFile("hello3.txt","這是通過writeFile寫入的內容",{flag:"r+"} , function (err) {if(!err){console.log("寫入成功~~~");}else{console.log(err);} });*///C:\Users\lilichao\Desktop\hello.txt //C:\\Users\\lilichao\\Desktop\\hello.txtfs.writeFile("C:/Users/lilichao/Desktop/hello.txt","這是通過writeFile寫入的內容",{flag:"w"} , function (err) {if(!err){console.log("寫入成功~~~");}else{console.log(err);} }); /*同步、異步、簡單文件的寫入都不適合大文件的寫入,性能較差,容易導致內存溢出*/ var fs = require("fs");//流式文件寫入 //創建一個可寫流 /*fs.createWriteStream(path[, options])- 可以用來創建一個可寫流- path,文件路徑- options 配置的參數*/ var ws = fs.createWriteStream("hello3.txt");//可以通過監聽流的open和close事件來監聽流的打開和關閉 /*on(事件字符串,回調函數)- 可以為對象綁定一個事件once(事件字符串,回調函數)- 可以為對象綁定一個一次性的事件,該事件將會在觸發一次以后自動失效* */ ws.once("open",function () {console.log("流打開了~~~"); });ws.once("close",function () {console.log("流關閉了~~~"); });//通過ws向文件中輸出內容 ws.write("通過可寫流寫入文件的內容"); ws.write("今天天氣真不錯"); ws.write("鋤禾日當午"); ws.write("紅掌撥清清"); ws.write("清清真漂亮");//關閉流,關閉寫的那個文件的管口 ws.end(); //關閉流,關閉讀的那個文件的管口 /*1.同步文件讀取2.異步文件讀取3.簡單文件讀取fs.readFile(path[, options], callback)fs.readFileSync(path[, options])- path 要讀取的文件的路徑- options 讀取的選項- callback回調函數,通過回調函數將讀取到內容返回(err , data)err 錯誤對象data 讀取到的數據,會返回一個Buffer4.流式文件讀取*/var fs = require("fs");var path = "C:/Users/lilichao/Desktop/筆記.mp3";fs.readFile("an.jpg" , function (err , data) {if(!err){//console.log(data);//將data寫入到文件中fs.writeFile("C:/Users/lilichao/Desktop/hello.jpg",data,function(err){if(!err){console.log("文件寫入成功");}} );} }); /*流式文件讀取也適用于一些比較大的文件,可以分多次將文件讀取到內存中*/var fs = require("fs");//創建一個可讀流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/筆記.mp3"); //創建一個可寫流 var ws = fs.createWriteStream("a.mp3");//監聽流的開啟和關閉 rs.once("open",function () {console.log("可讀流打開了~~"); });rs.once("close",function () {console.log("可讀流關閉了~~");//數據讀取完畢,關閉可寫流ws.end(); });ws.once("open",function () {console.log("可寫流打開了~~"); });ws.once("close",function () {console.log("可寫流關閉了~~"); });//如果要讀取一個可讀流中的數據,必須要為可讀流綁定一個data事件,data事件綁定完畢,它會自動開始讀取數據 rs.on("data", function (data) {//console.log(data);//將讀取到的數據寫入到可寫流中ws.write(data); }); /*流式文件讀取也適用于一些比較大的文件,可以分多次將文件讀取到內存中*/var fs = require("fs");//創建一個可讀流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/筆記.mp3"); //創建一個可寫流 var ws = fs.createWriteStream("b.mp3");//pipe()可以將可讀流中的內容,直接輸出到可寫流中 rs.pipe(ws); node- 包(package)- 將多個模塊組合為一個完整的功能,就是一個包- 包結構bin- 二進制的可執行文件,一般都是一些工具包中才有lib- js文件doc- 文檔test- 測試代碼package.json- 包的描述文件- package.json - 它是一個json格式的文件,在它里面保存了包各種相關的信息name 包名version 版本dependencies 依賴main 包的主要的文件bin 可執行文件- npm(Node Package Manager node的包管理器)- 通過npm可以對node中的包進行上傳、下載、搜索等操作- npm會在安裝完node以后,自動安裝- npm的常用指令npm -v 查看npm的版本npm version 查看所有模塊的版本npm init 初始化項目(創建package.json)npm i/install 包名 安裝指定的包npm i/install 包名 --save 安裝指定的包并添加依賴npm i/install 包名 -g 全局安裝(一般都是一些工具)npm i/install 安裝當前項目所依賴的包npm s/search 包名 搜索包 npm r/remove 包名 刪除一個包文件系統(File System)- Buffer(緩沖區)- Buffer和數組的結構的非常類似,Buffer是用來存儲二進制數據的- Buffer的方法- Buffer.from(字符串)- 將一個字符串中內容保存到一個buffer中- buf.toString()- 將buffer轉換為一個字符串- Buffer.alloc(size)- 創建一個指定大小的buffer對象- Buffer.allocUnsafe(size)- 創建一個指定大小的buffer對象,可以包含敏感數據- fs模塊- 在Node通過fs模塊來對系統中的文件進行操作,fs模塊是node中已經繼承好了,不需要在使用npm下載,直接引入即可- 引入fsvar fs = require("fs");- fs模塊中的大部分操作都提供了兩種方法,同步方法和異步方法同步方法帶sync異步方法沒有sync,都需要回調函數- 寫入文件1.同步寫入2.異步寫入3.簡單寫入4.流式寫入- 讀取文件1.同步讀取2.異步讀取3.簡單讀取4.流式讀取- 方法- 打開文件fs.open(path, flags[, mode], callback)fs.openSync(path, flags[, mode])- 讀寫文件fs.write(fd, string[, position[, encoding]], callback)fs.writeSync(fd, string[, position[, encoding]])fs.read(fd, buffer, offset, length, position, callback)fs.readSync(fd, buffer, offset, length, position)- 關閉文件fs.close(fd,callback)fs.closeSync(fd);- 簡單文件讀取和寫入fs.writeFile(file, data[, options], callback)fs.writeFileSync(file, data[, options])fs.readFile(path[, options], callback)fs.readFileSync(path[, options])- 流式文件讀取和寫入- 流式讀取和寫入適用于一些比較大的文件fs.createWriteStream(path[, options])fs.createReadStream(path[, options])總結
以上是生活随笔為你收集整理的NodeJs(尚硅谷视频学习笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker的概念及基本指令学习(从安装
- 下一篇: 【OpenCV】 车牌识别检测