最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js中Util模塊作用教程示例詳解

 更新時間:2021年11月25日 10:49:47   作者:廈門在乎科技  
這篇文章主要為大家介紹了node.js中Util模塊的教程示例詳解,帶大家充分的了解node.js的util模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助

從類型判斷說起

在 JavaScript 中,進行變量的類型校驗是一個非常令人頭疼的事,如果只是簡單的使用?typeof?會到各種各樣的問題。

舉幾個簡單的:

console.log(typeof null) // 'object'
console.log(typeof new Array) // 'object'
console.log(typeof new String) // 'object'

后來,大家發(fā)現(xiàn)可以使用?Object.prototype.toString()?方法來進行變量類型的判斷。

const getTypeString = obj => Object.prototype.toString.call(obj)
 
getTypeString(null) // '[object Null]'
getTypeString('string') //'[object String]'
getTypeString(new String) //'[object String]'

對?toString()?方法進行代理,可以得到一個類型字符串,我們就可以在這個字符串上面搞事情。

const getTypeString = obj => {
  return Object.prototype.toString.call(obj)
}
const isType = type => {
  return obj => {
    return getTypeString(obj) === `[object ${type}]`
  }
} 
const isArray = isType('Array') // 該方法一般通過 Array.isArray 代替
const isNull = isType('Null')
const isObject = isType('Object')
const isRegExp = isType('RegExp')
const isFunction = isType('Function')
const isAsyncFunction = isType('AsyncFunction')
isNull(null) // true
isObject({}) // true
isRegExp(/\w/) // true
isFunction(() => {}) // true
isAsyncFunction(async () => {}) // true

But,在 Node.js 中,內(nèi)部其實是有一組用來判斷變量類型的 api 的。而且功能異常豐富,除了基礎(chǔ)類型的判斷,還支持判斷 Promise 對象、Date 對象、各種ArrayBuffer。

const types = require('util/types')
types.isDate(new Date) // true
types.isPromise(new Promise(() => {})) // true
types.isArrayBuffer(new ArrayBuffer(16)) // true

嚴格相等

在 JavaScript 中,對象、數(shù)組等變量在判斷相等的過程中,如果用?===?通常只會判斷這兩個變量是否指向同一內(nèi)存地址。如果想判斷對象的鍵對應(yīng)的所有值是否相等,需要對兩個對象進行遍歷。在?util?中,也提供了一個方法可以用來判斷兩個對象是否嚴格相等:util.isDeepStrictEqual(val1, val2)

const util = require('util')
const val1 = { name: 'shenfq' }
const val2 = { name: 'shenfq' } 
console.log('val1 === val2', val1 === val2) // false
console.log('isDeepStrictEqual', util.isDeepStrictEqual(val1, val2)) // true

該方法同樣可以用來判斷數(shù)組,是否嚴格相等:

const util = require('util')
const arr1 = [1, 3, 5]
const arr2 = [1, 3, 5]
console.log('arr1 === arr2', arr1 === arr2) // false
console.log('isDeepStrictEqual', util.isDeepStrictEqual(arr1, arr2)) // true

Error First & Promise

早期的 Node API 都是?Error First?風(fēng)格的,也就是所有的異步函數(shù)都會接受一個回調(diào)函數(shù),該回調(diào)的一個參數(shù)為 error 對象,如果正常返回 error 對象為?null,后面的參數(shù)為成功響應(yīng)的結(jié)果。

// 下面是一個讀取文件的示例
const fs = require('fs')
fs.readFile('nginx.log', (error, data) => {
  if (error) {
    // 讀取文件失敗
    console.error(error)
    return
  }
  // 讀取文件成功,打印結(jié)果
  console.log(data)
})

在 Node 8 發(fā)布的時候,新增了一個?promisify?接口,用于將?Error First?風(fēng)格的 API 轉(zhuǎn)為 Promise API。

const fs = require('fs')
const util = require('util') 
const readFile = util.promisify(fs.readFile)
readFile('./2021-11-11.log', { encoding: 'utf-8' })
  .then(text => console.log(text)) 
    .catch(error => console.error(error))

不過,后來也有很多人覺得這些原生 API 支持 Promise 的方式太過繁瑣,每個 API 都需要單獨的包裝一層?promisify?方法。在 Node 10 發(fā)布的時候,原生模塊都新增了一個?.promises?屬性,該屬性下的所有 API 都 Promise 風(fēng)格的。

const fs = require('fs').promises
fs.readFile('./2021-11-11.log', { encoding: 'utf-8' })
  .then(text => console.log(text)) 
    .catch(error => console.error(error))

注意:Node 14 后,promises?API 又新增了一種引入方式,通過修改包名的方式引入。

const fs = require('fs/promises')
fs.readFile('./2021-11-11.log', { encoding: 'utf-8' })
  .then(text => console.log(text)) 
    .catch(error => console.error(error))

除了將?Error First?風(fēng)格的 API 轉(zhuǎn)為 Promise API,util?中還提供?callbackify?方法,用于將?async?函數(shù)轉(zhuǎn)換為?Error First?風(fēng)格的函數(shù)。

下面通過?callbackify?將 promise 化的?fs?還原為?Error First?風(fēng)格的函數(shù)。

const fs = require('fs/promises')
const util = require('util')
const readFile = util.callbackify(fs.readFile)
readFile('./2021-11-12.log', { encoding: 'utf-8' }, (error, text) => {
  if (error) {
    console.error(error)
    return
  }
  console.log(text)
})

調(diào)試與輸出

如果有開發(fā)過 Node 服務(wù),應(yīng)該都用過?debug?模塊,通過該模塊可以在控制臺看到更加明晰的調(diào)試信息。

const debug = require('debug')
const log = debug('app')
const user = { name: 'shenfq' } 
log('當(dāng)前用戶: %o', user)

其實,通過?util.debug?也能實現(xiàn)類似的效果:

const debug = require('debug')
const log = debug('app')
const user = { name: 'shenfq' } 
log('當(dāng)前用戶: %o', user)

只是在啟動時,需要將?DEBUG?環(huán)境變量替換為?NODE_DEBUG。

如果你有認真看上面的代碼,應(yīng)該會發(fā)現(xiàn),在?log('當(dāng)前用戶: %o', user)?方法前面的字符串中,有一個?%o?占位符,表示這個地方將會填充一個對象(object)。這與 C 語言或 python 中的,printf?類似。同樣,在?util?模塊中,直接提供了格式化的方法:util.format。

const { format } = require('util')
console.log(
  format('當(dāng)前用戶: %o', {
    name: 'shenfq', age: 25
  })
)

除了?%o?占位符,不同的數(shù)據(jù)類型應(yīng)使用不同的占位符。

占位符 類型
%s 字符串
%d 數(shù)字(包括整數(shù)和浮點數(shù))
%i 整數(shù)
%f 浮點數(shù)
%j JSON
%o Object

JavaScript 中的對象是一個很復(fù)雜的東西,除了直接使用?util.format?外加?%o?占位符的方式格式化對象,util?中還提供了一個叫做?inspect?方法來進行對象格式化。

const { inspect } = require('util')
const user = {
  age: 25,
  name: 'shenfq',
  work: {
    name: 'coding',
    seniority: 5
  }
} 
console.log(inspect(user))

這么看?inspect?好像什么都沒做,但是?inspect?方法還有第二個參數(shù),用來進行格式化時的一些個性化配置。

depth: number:控制顯示層級;

sorted: boolean|Function: 是否按照key的編碼值進行排序;

compact: boolean:是否進行單行顯示;

當(dāng)然上面只是一部分配置,更詳細的配置可查閱 node 文檔,下面我們寫幾個案例:

所有的屬性都換行顯示:

inspect(user, {
    compact: false
})

只格式化對象第一層的值:

inspect(user, {
  depth: 0,
    compact: false
})

按照key值的編碼倒序輸出:

inspect(user, {
    compact: false,
  sorted: (a, b) => a < b ? 1 : -1
})

以上就是node.js中Util模塊教程示例詳解的詳細內(nèi)容,更多關(guān)于node.js中Util模塊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Nodejs文件上傳、監(jiān)聽上傳進度的代碼

    Nodejs文件上傳、監(jiān)聽上傳進度的代碼

    這篇文章主要介紹了Nodejs文件上傳、監(jiān)聽上傳進度,本文通過實例代碼給大家詳細介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機器人的項目實踐

    Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機器人的項目實踐

    本文主要介紹了Node.js、Socket.IO和GPT-4構(gòu)建AI聊天機器人的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Node使用koa2實現(xiàn)一個簡單JWT鑒權(quán)的方法

    Node使用koa2實現(xiàn)一個簡單JWT鑒權(quán)的方法

    這篇文章主要介紹了Node使用koa2實現(xiàn)一個簡單JWT鑒權(quán)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • express項目文件目錄說明以及功能描述詳解

    express項目文件目錄說明以及功能描述詳解

    這篇文章主要給大家介紹了關(guān)于express項目文件目錄說明以及功能描述的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 利用node+koa+axios實現(xiàn)圖片上傳和回顯功能

    利用node+koa+axios實現(xiàn)圖片上傳和回顯功能

    這篇文章為大家詳細介紹了如何利用node+koa+axios實現(xiàn)圖片上傳和回顯功能,主要實現(xiàn)簡單的圖片上傳和靜態(tài)內(nèi)容的訪問,感興趣的可以了解一下
    2022-05-05
  • PHPStorm中如何對nodejs項目進行單元測試詳解

    PHPStorm中如何對nodejs項目進行單元測試詳解

    這篇文章主要給大家介紹了關(guān)于PHPStorm中如何對nodejs項目進行單元測試的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • nodejs服務(wù)內(nèi)存泄露排查過程和優(yōu)化方法

    nodejs服務(wù)內(nèi)存泄露排查過程和優(yōu)化方法

    在開發(fā)和部署Node.js應(yīng)用程序時,內(nèi)存泄露是一個常見的挑戰(zhàn),本文將探討如何對于一個陌生項目進行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Node.js高級編程cluster環(huán)境及源碼調(diào)試詳解

    Node.js高級編程cluster環(huán)境及源碼調(diào)試詳解

    這篇文章主要為大家介紹了Node.js高級編程cluster環(huán)境及源碼調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 剖析Node.js異步編程中的回調(diào)與代碼設(shè)計模式

    剖析Node.js異步編程中的回調(diào)與代碼設(shè)計模式

    這篇文章主要介紹了Node.js異步編程中的回調(diào)與代碼設(shè)計模式,雖然大多數(shù)場合回調(diào)編寫時的長串括號不怎么好看,但Node的異步性能確實很好,需要的朋友可以參考下
    2016-02-02
  • node.js使用免費的阿里云ip查詢獲取ip所在地【推薦】

    node.js使用免費的阿里云ip查詢獲取ip所在地【推薦】

    這篇文章主要介紹了node.js使用免費的阿里云ip查詢獲取ip所在地的相關(guān)知識,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-09-09

最新評論

锡林郭勒盟| 塔河县| 贵阳市| 郴州市| 福贡县| 淅川县| 子洲县| 沁源县| 长岛县| 安达市| 深水埗区| 昌图县| 宣武区| 昆山市| 淮北市| 化州市| 蓬安县| 阳山县| 绥化市| 闻喜县| 阿荣旗| 永顺县| 安徽省| 铜鼓县| 赤城县| 陕西省| 会东县| 龙川县| 太湖县| 阳春市| 赫章县| 克山县| 祁连县| 明水县| 湖口县| 娱乐| 弋阳县| 棋牌| 龙江县| 利辛县| 巴林右旗|