美文网首页程序员
Node.js Utilities

Node.js Utilities

作者: 小菜荔枝 | 来源:发表于2016-10-19 15:25 被阅读0次

    Util

    稳定性:2 - Stable

    util是用来支持Node.js内部APIs需求的模块,同时对于开发应用程序与模块也有很大的帮助,作者在工作中经常使用util模块进行调试,所以今天研究了下该模块并写出自己的一些心得与大家分享。
    首先要引用util模块:

    const util = require('util');
    

    util.format(format[,...args])

    • format <String> 类似于printf格式的字符串
    • args 选填参数
    • Returns 根据第一个参数format的形式,返回格式化后的字符串

    第一个参数format可包含零个或多个占位符,占位符格式如下:

    • %s - String
    • %d - Number 整型和浮点型都可以
    • %j - JSON 如果对应的参数属于循环引用(Circular references),则该占位符会被替换为'[Circular]'
    • %% - 表示字符'%',不代表占位符

    如果占位符没有与其对应的参数,则该占位符不会被替换。

    util.format('%s:%s', 'foo'); 
        // Returns 'foo:%s'
    util.format('%s:%s', 'I say', 'hello');  
        // Returns 'I say:hello'
    

    如果args的个数大于占位符的个数,则多余的参数会被util.inspect()强制转换成字符串,并且通过空格连接到正常返回的字符串中。

    util.format('%s:%s', 'foo', 'bar', 'baz', 1);
        // Returns 'foo:bar baz 1'
        // 1. 如果没有多余的参数,则正常返回的字符串是'foo:bar'
        // 2. 现在多出两个参数'baz'和 1,则这两个参数会被强制转化成字符串,并且通过空格连接到正常返回的字符串中
    

    如果第一个参数里面没有占位符,则所有的args参数都会被util.inspect()强制转换成字符串,并且通过空格连接在一起作为返回值。

    util.format(1, 2, 3); // '1 2 3'
    

    下面还有一些例子:

    util.format('%%', 'hello');  /* '% hello' */
    var obj = {
        str: 'abc',
        no: 1,
        arr: [1,2,3,4,5],
    };
    util.format('%j', obj);     
    JSON.stringify(obj);
    /* 以上两个的结果都是{"string":"abc","no":1,"arr":[1,2,3,4,5]} */
    
    obj.a = obj;    // 循环引用 circular reference
    util.format('%j', obj);     // Returns '[Circular]'
    JSON.Stringify(obj);        // 报错TypeError: Converting circular structure to JSON
    

    通过以上代码我们可知有关JSON格式化util.format()JSON.stringify()得到的结果是一样的,但对于循环引用(关于循环引用circular reference今后会详细介绍,在这里就不过多说明了,有兴趣的同学请自行百度或者关注我的简书进行交流),JSON.stringify()会报错,util.format()会返回'[Circular]'字符串,** 根本原因在于JSON默认不支持循环引用,所以会造成这种情况 **。
    最后,扩展一下,JavaScript中的window对象和DOM节点、Nodejs中的global对象也都属于循环引用,有兴趣的同学可以多多了解一下。

    util.inspect(object[, options])

    返回一个描述object的字符串,调试的时候非常实用。以下是有关options的设置

    • showHidden 如果设置为true,则对象的non-enumerablesymbol属性也会显示出来,默认为false
    • depth 当格式化对象的时候,确定递归的次数,默认为2,如果想无限递归格式化,就设置为null
    • color 如果设置为true,则输出带有ANSI颜色的代码,默认为false。颜色是可以自定义的,详情请见文档,这里不作说明
    • customInspect 如果设置为false,则对象自定义的inspect(depth, opts)将会失效(后面会做说明),默认为true
    var obj = {    
          str: 'abc',    
          num: 1,
          arr: [1,2,3,4,5],
          undef: undefined,
          object: {
              a:{
                  b:{
                      c:'whatever'
                  }
              }
          }
    };
    console.log(util.inspect(obj));
    Object.defineProperty(obj, 'spy', {  //定义obj.spy,因为他藏得很深,就叫它spy, ^_^
          value: 'I am spy',
          enumerable: false  // non-enumerable
    });
    console.log(util.inspect(obj, {
          showHidden: true,
          depth:1,
          colors:true
    }));
    
    console输出结果
    第二次输出结果带了颜色,并且输出了两个non-enumerable属性[spy][length]length是数组对象的non-enumerable属性),注意object的输出不一致,因为第一个输出depth默认是2,第二个输出则设置成了1
    对象也可以自定义inspect方法
    var obj = { foo: 'whatever' };
    obj.inspect = function(depth) {
          return { bar: this.foo };
    };
    console.log(util.inspect(obj));    // { bar: 'whatever' }
    console.log(util.inspect(obj, {customInspect: false}));    // 这个时候自定义的inspect方法不会被调用,返回{ foo: 'whatever', inspect: [Function] }
    

    util.debuglog(section)

    • section <String> 标识程序中需要debug的部分
    • Returns <Function> 日志输出函数,输出到stderr,跟console.error()类似
    var debuglog = util.debuglog('foo');
    var bar = 123;
    debuglog('hello from foo [%d]', bar);
    

    如果程序是在设置了环境变量NODE_DEBUG=foo的前提下运行的,则会输出

    FOO 3245: hello from foo [123]
    

    3245代表pid,如果没有设置该环境变量,则不会输出任何东西,如果有多个NODE_DEBUG的环境变量,请用逗号分隔,如NODE_DEBUG=fs,net,tls

    util.deprecate(function, string)

    表明一个方法不应该再被使用(怎么会有这个方法,一脸懵逼不是吗)

    var puts = util.deprecate(function() {
          // do something print or anything
    }, '请不要用puts,用console.log代替');
    util.puts();
    util.puts();
    puts();
    puts();
    
    输出结果

    通过结果我们可知,调用util.puts()的时候node会输出
    (node) util.puts is deprecated. Use console.log instead.
    而调用puts()的时候会输出我们自定义的信息
    请不要用puts,用console.log代替
    而且大家要注意,这两种方式我分别调用了2次,但信息默认只会输出一次的。util.deprecate也可以配合命令行使用,大家可以参考文档说明,这里就不详述了。

    本文档是根据nodeJS目前稳定版本的文档Node.js v4.4.4 Documentation进行总结的,如您在阅读的过程中发现问题,请联系作者,最后感谢您的支持!

    简书作者 小菜荔枝 转载请联系作者获得授权

    相关文章

      网友评论

        本文标题:Node.js Utilities

        本文链接:https://www.haomeiwen.com/subject/gksxuttx.html