Node中util模块的作用和基本用法是怎样的
Admin 2022-07-13 群英技术资讯 863 次浏览
这篇文章给大家分享的是Node中util模块的作用和基本用法是怎样的。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题。
举几个简单的:
console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object'
后来,大家发现可以使用 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 中,内部其实是有一组用来判断变量类型的 api 的。而且功能异常丰富,除了基础类型的判断,还支持判断 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 中,对象、数组等变量在判断相等的过程中,如果用 === 通常只会判断这两个变量是否指向同一内存地址。如果想判断对象的键对应的所有值是否相等,需要对两个对象进行遍历。在 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
该方法同样可以用来判断数组,是否严格相等:
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
早期的 Node API 都是 Error First 风格的,也就是所有的异步函数都会接受一个回调函数,该回调的一个参数为 error 对象,如果正常返回 error 对象为 null,后面的参数为成功响应的结果。
// 下面是一个读取文件的示例
const fs = require('fs')
fs.readFile('nginx.log', (error, data) => {
if (error) {
// 读取文件失败
console.error(error)
return
}
// 读取文件成功,打印结果
console.log(data)
})
在 Node 8 发布的时候,新增了一个 promisify 接口,用于将 Error First 风格的 API 转为 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 发布的时候,原生模块都新增了一个 .promises 属性,该属性下的所有 API 都 Promise 风格的。
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 风格的 API 转为 Promise API,util 中还提供 callbackify 方法,用于将 async 函数转换为 Error First 风格的函数。
下面通过 callbackify 将 promise 化的 fs 还原为 Error First 风格的函数。
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)
})
如果有开发过 Node 服务,应该都用过 debug 模块,通过该模块可以在控制台看到更加明晰的调试信息。
const debug = require('debug')
const log = debug('app')
const user = { name: 'shenfq' }
log('当前用户: %o', user)
其实,通过 util.debug 也能实现类似的效果:
const debug = require('debug')
const log = debug('app')
const user = { name: 'shenfq' }
log('当前用户: %o', user)
只是在启动时,需要将 DEBUG 环境变量替换为 NODE_DEBUG。
如果你有认真看上面的代码,应该会发现,在 log('当前用户: %o', user) 方法前面的字符串中,有一个 %o 占位符,表示这个地方将会填充一个对象(object)。这与 C 语言或 python 中的,printf 类似。同样,在 util 模块中,直接提供了格式化的方法:util.format。
const { format } = require('util')
console.log(
format('当前用户: %o', {
name: 'shenfq', age: 25
})
)
除了 %o 占位符,不同的数据类型应使用不同的占位符。
| 占位符 | 类型 |
|---|---|
| %s | 字符串 |
| %d | 数字(包括整数和浮点数) |
| %i | 整数 |
| %f | 浮点数 |
| %j | JSON |
| %o | Object |
JavaScript 中的对象是一个很复杂的东西,除了直接使用 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 方法还有第二个参数,用来进行格式化时的一些个性化配置。
depth: number:控制显示层级;
sorted: boolean|Function: 是否按照key的编码值进行排序;
compact: boolean:是否进行单行显示;
当然上面只是一部分配置,更详细的配置可查阅 node 文档,下面我们写几个案例:
所有的属性都换行显示:
inspect(user, {
compact: false
})
只格式化对象第一层的值:
inspect(user, {
depth: 0,
compact: false
})
按照key值的编码倒序输出:
inspect(user, {
compact: false,
sorted: (a, b) => a < b ? 1 : -1
})
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
jquery实现轮播效果的方法:1、通过jquery的hover()绑定鼠标上悬以及离开时的事件处理;2、 通过jquery的bind()方法绑定鼠标点击事件处理前后翻动即可。
React 是一个用于构建用户界面的 JAVASCRIPT 库。这篇文章主要介绍了React组件的两种创建方式,一种是使用函数创建组件另一种是使用类创建组件,需要的朋友可以参考下
这篇文章主要介绍了antd table按表格里的日期去排序操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
其实在很多文章都会写call,apply,bind,但个人觉着如果不弄懂原理,是很难理解透的,所以这篇文章主要介绍了JavaScript中call、apply、bind实现原理的相关资料,需要的朋友可以参考下
concat()可以基于当前数组中的所有项目创建一个新的数组。这种方法首先创建当前的数组副本,然后将接收到的参数添加到该副本的末尾,最后返回新构建的数组。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008