記錄Node.js經常使用的API。css
原生JavaScript中沒有處理二進制數據流的機制,而服務端有處理二進制數據流的需求,對此,nodeJS引入了Buffer類來處理二進制數據。html
// 建立一個長度爲3,值爲0的Buffer
const buf1 = Buffer.alloc(3)
console.log(buf1)
// 輸出:<Buffer 00 00 00>
// 建立一個長度爲3,值爲16的Buffer
const buf2 = Buffer.alloc(3, 16)
console.log(buf2)
// 輸出:<Buffer 10 10 10>
//encoding是編碼方式,默認爲utf8
複製代碼
// 接收一個整數數組,返回一個buffer對象
const buf = Buffer.from([1, 2, 3])
console.log(buf)
// 輸出<Buffer 00 02 03>
複製代碼
// 接收一個字符串,返回一個buffer對象,encoding是編碼方式,默認爲utf8
const buf = Buffer.from('Hello World!')
console.log(buf.toString())
// 輸出Hello World!
複製代碼
// 判斷是否支持某種編碼方式
console.log(Buffer.isEncoding('utf8')) //輸出true
console.log(Buffer.isEncoding('ascii')) //輸出true
console.log(Buffer.isEncoding('base64')) //輸出true
複製代碼
// 判斷是否爲Buffer對象
console.log(Buffer.isBuffer(Buffer.alloc(3))) // 輸出true
console.log(Buffer.isBuffer('000')) // 輸出false
複製代碼
// 返回指定編碼方式的字符串長度
const str = '\u00bd + \u00bc = \u00be' // Unicode編碼的字符串
console.log(str.length) // Unicode編碼的字符串長度爲9
console.log(Buffer.byteLength(str,'utf8')) // utf8編碼的字符串長度爲12
複製代碼
// 合併傳入的buffer數組,totalLength表示最終返回的buffer的長度
const buf1 = Buffer.alloc(1, 1)
const buf2 = Buffer.alloc(1, 2)
const buf3 = Buffer.alloc(1, 3)
const buf4 = Buffer.concat([buf1, buf2, buf3])
console.log(buf4)
// 輸出<Buffer 01 02 03>
const buf5 = Buffer.concat([buf1, buf2, buf3], 2)
console.log(buf5)
// 輸出<Buffer 01 02>
const buf6 = Buffer.concat([buf1, buf2, buf3], 4)
console.log(buf6)
// 輸出<Buffer 01 02 03 00>
複製代碼
// 向buffer寫入內容,offset爲開始寫入的位置,length爲寫入的長度,encoding爲寫入內容的編碼方式
const buf = Buffer.alloc(10);
buf.write('hello',1 , 4) //在1的位置開始寫入前4位的'hello'
console.log(buf)
// 輸出<Buffer 00 68 65 6c 6c 00 00 00 00 00>
console.log(buf.toString())
// 輸出hell
複製代碼
// 截取buffer的一部分,start是開始位置,不傳則複製整個buf,end爲結束位置,不傳則截取到最後一位
const buf1 = Buffer.from('Hello World!')
const buf2 = buf1.slice(1, 5)
const buf3 = buf1.slice(1)
const buf4 = buf1.slice()
console.log(buf2.toString())
console.log(buf3.toString())
console.log(buf4.toString())
// 輸出ello
// ello World!
// Hello World!
複製代碼
// 將二進制數據流轉換爲字符串,encoding是編碼方式,start與end效果同slice相似
const buf = Buffer.from('Hello World!')
console.log(buf.toString('utf8',1,5))
console.log(buf.toString('utf8',1))
console.log(buf.toString('utf8'))
// 輸出ello
// ello World!
// Hello World!
複製代碼
path不在全局做用域中,須要先引入再使用前端
const path = require('path')
複製代碼
// 得到文件名及文件後綴,ext是文件後綴,若ext與實際文件後綴匹配則不輸出文件後綴,不然忽略ext
const basename1 = path.basename('/a/b/c/d/index.html')
const basename2 = path.basename('/a/b/c/d/index.html','.html')
const basename3 = path.basename('/a/b/c/d/index.html','.css') // 第二個參數會被忽略
console.log(basename1, basename2, basename3)
// 輸出index.html index index.html
複製代碼
// 得到不帶文件名的文件路徑
const dirname = path.dirname('/a/b/c/d/index.html')
console.log(dirname)
// 輸出 /a/b/c/d
複製代碼
// 得到文件後綴名
const extname = path.extname('/a/b/c/d/index.html')
console.log(extname)
// 輸出 .html
複製代碼
// 將路徑字符串轉換爲路徑對象
const pathObj = path.parse('E:\\a\\b\\c\\d\\index.html')
console.log(pathObj)
/* 輸出
* {
* root: 'E:\\', // 文件根目錄
* dir: 'E:\\a\\b\\c\\d', // 不帶文件名的文件路徑
* base: 'index.html', // 文件名
* ext: '.html', // 文件後綴
* name: 'index' // 不帶後綴的文件名
* }
*/
複製代碼
// 將路徑對象轉換爲路徑字符串
const pathObj = {
root: 'E:\\',
dir: 'E:\\a\\b\\c\\d',
base: 'index.html',
ext: '.html',
name: 'index'
}
console.log(path.format(pathObj))
// 輸出 E:\a\b\c\d\index.html
// 注意:路徑對象的每一個屬性不是必須的,提供了dir屬性時會忽略root屬性,提供了base屬性時會忽略ext與name屬性
複製代碼
// 判斷路徑是不是絕對路徑
console.log(path.isAbsolute('E:/a/b/c/d\index.html'))
console.log(path.isAbsolute('./a/b/c/d\index.html'))
// 輸出 true false
複製代碼
// 接收一組路徑,並拼接爲一個路徑,../表示返回上一級目錄,./表示同級目錄
console.log(path.join('/a/b/c/d','../','./','index.html'))
// 輸出 \a\b\c\index.html
複製代碼
// 接收兩個路徑,返回第一個路徑到第二個路徑的相對路徑
const to = 'C:\\orandea\\test\\aaa'
const from = 'C:\\orandea\\impl\\bbb'
console.log(path.relative(to, from))
// 輸出 ..\..\impl\bbb
複製代碼
// 環境變量分隔符
console.log(path.delimiter)
// windows下輸出; Linux下是:
複製代碼
// 路徑分隔符
console.log(path.sep)
// windows下輸出\ Linux下是/
複製代碼
fs不在全局做用域中,須要先引入再使用node
const path = require('fs')
複製代碼
首先在同級目錄中建立文件text.text,內容爲Hello World!,稍後打印出來git
// 異步讀取文件內容
// 第一個參數爲目標文件路徑
// 第二個參數爲可選參數,指定讀取出來的字符編碼(encoding)及讀寫權限(flag),不指定字符編碼時,默認輸出二進制字節流
// 第三個參數爲讀取成功後的回調函數
// 回調函數有兩個參數,第一個參數是錯誤參數,爲null表示未發生錯誤,第二個參數爲讀取出來的內容字符串
fs.readFile(path.join('./text.text'),{encoding: 'utf8'}, (err,fileContent) => {
if(err !== null) {
// 輸出錯誤信息
console.log(err.stack)
} else {
// 輸出utf8編碼的Hello World!
console.log(fileContent)
}
})
複製代碼
// 同步讀取文件內容,同步執行時沒有回調函數,須要自定處理錯誤,函數返回文件內容
try {
const fileContent = fs.readFileSync(path.join('./text.tet'),{encoding: 'utf8'})
// 輸出utf8編碼的Hello World!
console.log(fileContent)
} catch(err) {
console.log('寫入文件發送錯誤,請檢查文件路徑')
}
複製代碼
// 異步寫入文件內容
// path與options參數同上,第二個參數data爲寫入的內容,回調函數只有一個錯誤對象參數err
fs.writeFile(path.join('./text.text'), 'Hello World!!!', {encoding: 'utf8'}, err => {
if(err !== null) {
console.error(err.stack)
}
})
// 再次查看text.text文件會發現內容改成了Hello World!!
複製代碼
// 同步寫入文件內容
try {
fs.writeFileSync('./text.text','Hello World!!!',{encoding: 'utf8'})
} catch (err) {
console.log('寫入文件發送錯誤,請檢查文件路徑')
}
// 再次查看text.text文件會發現內容改成了Hello World!!!
複製代碼
// 異步獲取文件對象
// 回調函數的第二個參數即爲文件對象
fs.stat('./text.text',(err, stat) => {
if(err) {
console.log(err.stack)
} else {
console.log(stat)
}
})
複製代碼
// 同步獲取文件對象
try {
const stat = fs.statSync('./text.text')
console.log(stat)
} catch (err) {
console.log('寫入文件發送錯誤,請檢查文件路徑')
}
複製代碼
// 判斷當前文件對象是不是文件目錄
複製代碼
// 判讀單當前文件對象是不是常規文件
複製代碼
// 文件建立時間
複製代碼
// 文件訪問時間
複製代碼
// 文件修改時間(指文件數據被修改)
複製代碼
// 文件修改時間(指文件訪問權限被修改)
複製代碼
// 異步建立一個文件目錄,第二個參數能夠經過recursive設置是否同時建立子文件夾
// 不存在a文件夾的時候會報錯
fs.mkdir('./a/b',err => {
if(err) {
console.log(err.stack)
}
})
// 設置第二個參數,在不存在a目錄的時候自動建立a目錄,而後在a目錄中建立b目錄
fs.mkdir('./a/b/c', {recursive: true}, err => {
if(err) {
console.log(err.stack)
}
})
複製代碼
// 同步建立文件夾
try {
fs.mkdirSync('./a/b', {recursive: true})
} catch (err) {
console.log('建立文件夾錯誤')
}
複製代碼
// 異步讀取一個目錄下的全部文件及文件夾
// __dirname是當前文件所在目錄的路徑
fs.readdir(__dirname,(err, files) => {
if(err) {
console.log(err.stack)
} else {
// 輸出指定目錄下的全部文件名及文件夾名組成的數組
console.log(files)
}
})
複製代碼
// 同步讀取一個目錄下的全部文件及文件夾
try {
const files = fs.readdirSync(__dirname)
console.log(files)
} catch (err) {
console.log('讀取文件夾錯誤')
}
複製代碼
// 異步刪除空文件夾
fs.rmdir('./a', err => {
if(err) {
console.log(err.stack)
}
})
// 注意:只能刪除空的文件夾,想要刪除非空文件夾可使用遞歸
複製代碼
// 同步刪除空文件夾
try {
fs.rmdirSync('./a')
} catch (err) {
console.log('刪除文件夾失敗')
}
複製代碼
// 當前文件所在的目錄的路徑
console.log(__dirname)
// 輸出 E:\demo\node
複製代碼
// 當前文件的路徑
console.log(__filename)
// 輸出 E:\demo\node\node\global.js
複製代碼
http模塊須要先引入再使用github
const http = require('http')
複製代碼
// 建立一個http server對象,用於監聽某個端口,製做一個服務器
const server = http.createServer((req, res) => {
// 返回響應並設置返回的內容
res.end('Hello World!')
})
// 監聽3000端口
server.listen(3000)
// 此時在瀏覽器中訪問localhost:3000便可看到返回的內容
複製代碼
req(request)對象是http的請求對象,是http.IncomingMessage的實例,咱們能夠在req對象中得到請求頭部,請求體中的參數等信息。express
res(response)對象是http的響應對象,是http.ServerResoponse的實例,咱們能夠經過res的方法設置響應信息。windows
// 寫入響應內容
const server = http.createServer((req, res) => {
// 設置返回的內容
res.write('Hello World!')
// 返回響應
res.end()
})
複製代碼
// 設置響應頭部
const server = http.createServer((req, res) => {
// 設置內容類型爲text/plain,編碼方式爲utf-8
res.setHeader('Content-Type', 'text/plain; charset=utf8')
// 返回響應並設置返回的內容
res.end('Hello World!')
})
複製代碼
// 設置響應狀態碼
const server = http.createServer((req, res) => {
// 設置響應狀態碼爲404
res.writeHead(404)
// 返回響應並設置返回的內容
res.end('Hello World!')
})
複製代碼
url須要先引入再使用數組
const url = require('url')
複製代碼
// 請求url能夠經過req對象得到
const server = http.createServer((req, res) => {
// 請求地址url
console.log(req.url)
res.end()
})
複製代碼
// 獲取前端發送的get請求的參數
// 第一個參數爲url,第二個參數爲是否將參數由字符串轉換爲對象
const urlString = 'localhost:3000?username=admin&password=123'
// 重點看query參數,query參數是前端發送的參數
console.log(url.parse(urlString).query)
// 輸出 username=admin&password=123
console.log(url.parse(urlString, true).query)
/* 輸出
* {
* username: 'admin',
* password: '123'
* }
*/
複製代碼
url須要先引入再使用瀏覽器
const querystring = require('querystring')
複製代碼
// 得到前端發送的post請求的參數
const paramsStr = 'username=admin&password=123'
console.log(querystring.parse(paramsStr))
/* 輸出
* {
* username: 'admin',
* password: '123'
* }
*/
複製代碼
若是這篇文章幫到你了,以爲不錯的話來點個Star吧。 github.com/lizijie123