亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

NodeJS常用 API 整理

 

一、Debug 調(diào)試方法

Node 的調(diào)試方法有很多,主要分為安裝 node-inspect 包調(diào)試、用 Chrome DevTools 調(diào)試和 IDE 調(diào)試,可以在官網(wǎng)的 Docs Debugging Guide 查看安裝方法。

下面介紹使用 Chrome DevTools 調(diào)試的方法,首先安裝 Chrome Extension NIM,打開 Inspect 入口頁面 chrome://inspect

寫一個簡單 debug.js 測試文件:

// apiTest/debug.js 
console.log("this is debug test")
function test () {
 console.log("hello world")
}
test()

使用node --inspect-brk來啟動腳本,-brk相當于在程序入口前加一個斷點,使得程序會在執(zhí)行前停下來

$ node --inspect-brk apiTest/debug.js 
Debugger listening on ws://127.0.0.1:9229/44b5d11e-3261-4090-a18c-2d811486fd0a
For help, see: https://nodejs.org/en/docs/inspector

在 chrome://inspect 中設置監(jiān)聽端口 9229(默認),就可以看到可以 debug 的頁面:

(function (exports, require, module, __filename, __dirname) { 
console.log("this is debug test")
function test () {
 console.log("hello world")
}
test()
});

如果我們使用node --inspect來啟動腳本,那整個代碼直接運行到代碼結(jié)尾,無法進行調(diào)試,但此時 Node 還進程沒有結(jié)束,所以可以在 http://127.0.0.1:9229/json/list 查詢 devtoolsFrontendUrl ,復制此 Url 到 Chrome 上進行調(diào)試。

看到使用 Chrome DevTools 的調(diào)試方法還是比較復雜的,一些 IDE 都支持直接斷點調(diào)試,推薦WebStorm、VScode。

二、全局變量

在 Node 中常用的全局方法有 CommonJS、Buffer、process、console、timer 等,這些方法不需要 require引入 API 就可以直接使用。

如果希望有屬性或方法可以*“全局使用”*,那就將它掛載在 Node 的global對象上:

global.gNum = 300
console.log(gNum); // 300

在 Node 中所有模塊都可以使用這些全局變量,以下就介紹 Node 中的全局變量

2.1 CommonJS 模塊

Node CommonJS 模塊規(guī)范根據(jù)實現(xiàn)了module、exports和require模塊機制。Node 對每個文件都被進行了模塊封裝,每個模塊有自己的作用域,如在 debug 時看到的:

(function (exports, require, module, __filename, __dirname) { 
	// some code
});

模塊機制中的 __dirname、__filename、exports、module、require()這些變量雖然看起來是全局的,但其實它們僅存在于模塊范圍。需要注意的幾點是:

  • 模塊內(nèi)部module變量代表模塊本身
  • 模塊提供require()方法引入外部模塊到當前的上下文中
  • module.exports屬性代表模塊對外接口,默認的快捷方式exports

簡單的使用方式如下:

/* common_exports.js */
exports.num = 100 
exports.obj = {
 a : 200
}
exports = {
 count : 300
}
/* common_require.js */
const mod = require('./common_exports')
console.log(mod) // { num: 100, obj: { a: 200 } }
console.log(mod.count) // undefined

注意到上例中的mod.count為undefined,這是因為exports只是module.exports的引用,可以給exports添加屬性,但不能修改exports的指向。

2.2 process 進程對象

process 包含了進程相關的屬性和方法,Node 的 process 文檔 中的內(nèi)容特別多,列舉幾個常用方法。

Node 進程啟動時傳遞的參數(shù)都在 process.arg數(shù)組中:

// process.js
const {argv , execPath} = process
argv.forEach((val, index) => {
 console.log(`${index}: ${val}`)
})
console.log(execPath)

可以在執(zhí)行 process.js 時傳遞其他參數(shù),這些參數(shù)都會保存在argv中:

$ node apiTest/process.js one=1 --inspect --version
0: /usr/local/bin/node
1: /Users/mobike/Documents/webProjects/testNode/apiTest/process.js
2: one=1
3: --inspect
4: --version
/usr/local/bin/node

process.argv第一個參數(shù)就是 process.execPath ,即調(diào)用執(zhí)行程序 Node 的路徑,第二個參數(shù)時被執(zhí)行的 JS 文件路徑,剩下的就是自定義參數(shù)。

process.env是包含運行環(huán)境各種參數(shù)的對象,可以直接輸出env查看所有參數(shù)信息,也可以輸出某個屬性:

const {env} = process.env
console.log(env.PATH) // /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Documents/webProjects/testNode/node_modules/.bin
console.log(env.SHELL) // /bin/zsh

在 webpack 打包過程中常用process.env.NODE_ENV判斷生產(chǎn)環(huán)境或開發(fā)環(huán)境,process.env是沒有NODE_ENV這個屬性的,你可以在系統(tǒng)環(huán)境變量中配置,也可以在項目程序直接設置process.env.NODE_ENV=‘dev’。

process.cwd()方法返回 Node.js 進程的當前工作目錄,和 Linus 命令$ pwd功能一樣:

// process.js
console.log(process.cwd()) // /Users/Documents/webProjects/testNode
復制代碼
$ node process.js
/Users/WebstormProjects/testNode
$ pwd
/Users/WebstormProjects/testNode

2.3 Timers 異步

Node 中的計時器方法與 Web 瀏覽器中的JS 計時器類似,但內(nèi)部實現(xiàn)是基于 Node 的 Event Loop。Node 中的計時器有setImmediate()、setTimeout()、setInterval()。

在 Node 中有一個輕量級的process.nextTick()異步方法,它是在當前事件隊列結(jié)束時調(diào)用, setImmediate()是當前 Node Event Loop 結(jié)束時立即執(zhí)行,那執(zhí)行順序有什么區(qū)別呢?

下面舉例說明process.nextTick(fn)與setImmediate(fn)與setTimeout(fn,0)之間的區(qū)別:

// timer.js 
setImmediate(()=>{
 console.log("setImmediate")
});
setTimeout(()=>{
 console.log("setTimeout 0")
},0);
setTimeout(()=>{
 console.log("setTimeout 100")
},100);
process.nextTick(()=>{
 console.log("nextTick")
 process.nextTick(()=>{
 console.log("nextTick inner")
 })
});

看下執(zhí)行結(jié)果:

$ node timer.js 
nextTick
nextTick inner
setTimeout 0
setImmediate
setTimeout 100

process.nextTick()中的回調(diào)函數(shù)最快執(zhí)行,因為它將異步事件插入到當前執(zhí)行隊列的末尾,但如果process.nextTick()中的事件執(zhí)行時間過長,后面的異步事件就被延遲。

setImmediate()執(zhí)行最慢,因為它將事件插入到下一個事件隊列的隊首,不會影響當前事件隊列的執(zhí)行。當setTimeout(fn, 0)是在setImmediate()之前執(zhí)行。

2.4 Buffer 二進制

Buffer 對象用于處理二進制數(shù)據(jù)流。JS 沒有處理二進制的功能,而 Node 中的一部分代碼是由 C++ 實現(xiàn)的,所有 Node 中的 Buffer 性能部分用 C++ 實現(xiàn),非性能部分由 JS 封裝。

Buffer 實例類似整數(shù)數(shù)組,元素為十六進制的兩位數(shù)(0~255),并且掛載在 global 對象上不需要 require就能使用。

最新的 Buffer API 使用Buffer.alloc(length, value)創(chuàng)建固定長度為 length 的 Buffer 實例,value 默認填充 0,使用Buffer.from()將其它類型數(shù)據(jù)轉(zhuǎn)為 Buffer:

console.log(Buffer.alloc(5)) // <Buffer 00 00 00 00 00>
console.log(Buffer.alloc(5, 44)) // <Buffer 2c 2c 2c 2c 2c>
console.log(Buffer.from([3, 4, 5])) // <Buffer 03 04 05>
console.log(Buffer.from('test')) // <Buffer 74 65 73 74>
console.log(Buffer.from('測試')) // <Buffer e6 b5 8b e8 af 95>

注意到字符串轉(zhuǎn) Buffer 時英文占一位,中文占三位,而不是四位,當中文亂碼的時可以考慮沒有正確讀取 Buffer 流。

Buffer 類提供幾個靜態(tài)方法,Buffer.byteLength()計算長度,Buffer.isBuffer()做驗證,Buffer.concat()拼接 Buffer 實例:

const buf1 = Buffer.from([3, 4, 5])
const buf2 = Buffer.from('test')
console.log(Buffer.byteLength('test')) // 4
console.log(Buffer.byteLength('測試')) // 6 
console.log(Buffer.isBuffer('test')) // false
console.log(Buffer.isBuffer(buf1)) // true
console.log(Buffer.concat([buf1, buf2])) // <Buffer 03 04 05 74 65 73 74>

除此之外,Buffer 實例也有常用的屬性和方法,類似 JS 中的 String,有l(wèi)ength、toString('base64')、equals()、indexOf()等。

三、基礎 API

3.1 path 路徑相關

path 是處理和路徑相關問題的內(nèi)置 API,可以直接require('path')使用。以下示例常用的 path 方法。

對路徑的處理常用path.normalize()規(guī)范路徑、path.join()拼接路徑,以及使用path.resolve()將相對路徑解析為絕對路徑:

const path = require('path')
console.log(
 path.normalize('//asd/das'), // /asd/das
 path.join('user', 'local'), // user/local
 path.resolve('./')) // /Users/Documents/webProjects/testNode/apiTest

解析某個路徑,可以用path.basename()得到文件名稱,path.extname()得到后綴擴展名,path.dirname()得到目錄名:

const path = require('path')
const filePath = 'webProjects/testNode/apiTest/path.js'
console.log(
 path.basename(filePath), // path.js 
 path.extname(filePath) // .js 
 path.dirname(filePath), // webProjects/testNode/apiTest
)

以上解析路徑方法得到某個值,還可以使用path.parse()完全解析路徑為一個對象,path.format()反向操作:

let sp = path.parse(filePath)
console.log(sp)
// { root: '',
// dir: 'webProjects/testNode/apiTest',
// base: 'path.js',
// ext: '.js',
// name: 'path' }
console.log(path.format(sp))
// webProjects/testNode/apiTest/path.js

除此之外,還有對于系統(tǒng)路徑的操作,使用path.sep取得路徑分隔符,路徑片段分隔符,POSIX 上是/, windows 上是,path.delimiter取得系統(tǒng)路徑定界符,POSIX 上是:,Windows 上是;,示例如下:

console.log(filePath.split(path.sep)) 
// [ 'webProjects', 'testNode', 'apiTest', 'path.js' ]
console.log(process.env.PATH) // 系統(tǒng)路徑配置
// /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
console.log(process.env.PATH.split(path.delimiter))
// [ '/usr/local/bin', '/usr/bin', '/bin', '/usr/sbin', '/sbin' ]

以上就是 Node 對路徑的常用操作,需要注意的是,在獲取路徑時有幾種方式,得到的路徑是不同的:

  • __dirname 、__filename:總是返回文件絕對路徑;
  • process.cwd() 或 $ pwd :返回執(zhí)行 Node 命令的文件夾;
  • path.resolve('./'):是相對 Node 啟動文件夾,在require()中./是相對于當前文件夾;

3.2 events 事件

大部分 Node API 都采用異步事件驅(qū)動,所有能觸發(fā)事件對象都是 EventEmitter 類的實例,通過 EventEmitter.on()綁定事件,然后通過 EventEmitter.emit() 觸發(fā)事件。

// apiTest/events.js
const Events = require('events')
class MyEvents extends Events{
}
const event = new MyEvents()
event.on('test-event',()=>{
 console.log('this is an event')
})
event.emit('test-event')
setInterval(()=>{
 event.emit('test-event')
},500)

執(zhí)行以上代碼會一直連續(xù)處罰 test-event 事件,當然還可以傳遞事件參數(shù),并且可以傳遞多個參數(shù)。修改上訴代碼如下:

event.on('test-event', (data, time) => {
 console.log(data,time)
})
event.emit('test-event', [1, 2, 3], new Date())

$ node apiTest/events.js
[ 1, 2, 3 ] 2019-04-23T07:28:00.420Z

同一個事件監(jiān)聽器可以綁定多個事件,觸發(fā)時按照綁定順序加入執(zhí)行隊列,并且可以使用EventEmitter.removeListener()刪除監(jiān)聽器的事件:

function fn1 () {
 console.log('fn1')
}
function fn2 () {
 console.log('fn2')
}
event.on('multi-event',fn1)
event.on('multi-event',fn2)
setInterval(()=>{
 event.emit('multi-event')
},500)
setTimeout(()=>{
 event.removeListener('multi-event', fn2)
}, 600)

$ node apiTest/events.js
[ 1, 2, 3 ] 2019-04-23T07:39:11.624Z
fn1
fn2
fn1
fn1
...

3.3 fs 文件系統(tǒng)

Node 文件模塊通過require('fs)使用,所用方法都有同步和異步方法。

文件系統(tǒng)中的異步方法,第一個參數(shù)保留給異常,操作成功時參數(shù)值為null或undefined,最后一個參數(shù)就是回調(diào)函數(shù)。例如讀取文件的fs.readFile()和寫文件的fs.writeFile()示例如下:

const fs = require('fs')
fs.readFile('./apiTest/fs.js', (err, data) => {
 if (err) throw err
 console.log('readFile done!!!')
})
fs.writeFile('./apiTest/fs.txt', 'this is test file', {
 encoding: 'utf8'
}, (err) => {
 if (err) throw err
 console.log('writeFile done!!!')
})

分享到:
標簽:NodeJS
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定