How to change string representation of objects in Nodejs debug console view

前端 未结 4 855
轮回少年
轮回少年 2020-12-15 06:24

How do I change the string representation of an object instance in nodejs debug console. Is there a method (like toString() in .NET) I can override?

相关标签:
4条回答
  • 2020-12-15 06:40

    My two cents: How about overriding the console.log function to do what you want to. Here is the POC which needs a _toString function in any object to change the way it appears in the log.

    create a file logger.js with the following content:

    const getUpdatedLogObj = function(x){
    
    
        if(x && typeof x == 'object'){
                if(typeof x._toString === 'function'){
                    return x._toString()
                } else {
                    for(let i in x){
                        x[i] = getUpdatedLogObj(x[i])
                    }
                }
            }
            return x;
        }
    
    
    
        console._log = console.log
        console.log = function(x){console._log(getUpdatedLogObj({...x}))}
    

    import it in index.js

    require('./logger')
    
    console.log({a: 1, b: 2, c: {d: 5, e: 6, _toString: function(){return 'fromToString'}}})
    

    And you still get the navigaion:

    0 讨论(0)
  • 2020-12-15 06:57
    const util = require('util');
    class SomeObject{
    constructor(){
        this._varA = "some text";
        this._varB = 12345;
        this._varC = "some more text";
        this._varD = true;
        this._varE = 0.45;
    }
    
    [util.inspect.custom](depth, options) {
        return this.toString();
    }
    
    toString(){
        return "custom textual rapresentation of my object";
    }
    }
    
    var array = [];
    
    array.push(new SomeObject());
    array.push(new SomeObject());
    array.push(new SomeObject());
    
    console.log(array);
    
    0 讨论(0)
  • 2020-12-15 07:01

    There is a toString() method that you call on another string.

    terms[200]._text.toString()

    You may also be looking for JSON.stringify() which I find extremely useful in debugging. Since JavaScript objects are literally JSON, this will make printing them out to the console simpler.

    console.log(JSON.stringify(terms[200]))

    0 讨论(0)
  • 2020-12-15 07:03

    When you do console.log it internally calls formatValue in util.js, which has a below check

    const maybeCustomInspect = value[customInspectSymbol] || value.inspect;
    

    Which means if your value has a inspect method it gets called and then you can return the toString in the same. So change your code to

    class SomeObject{
        constructor(){
            this._varA = "some text";
            this._varB = 12345;
            this._varC = "some more text";
            this._varD = true;
            this._varE = 0.45;
        }
    
        inspect(depth, opts) {
            return this.toString();
        }
    
        toString(){
            return "custom textual rapresentation of my object";
        }
    }
    
    var array = [];
    
    array.push(new SomeObject());
    array.push(new SomeObject());
    array.push(new SomeObject());
    
    console.log(array);
    

    Makes it print

    [ custom textual rapresentation of my object,
      custom textual rapresentation of my object,
      custom textual rapresentation of my object ]
    

    Nodejs has documentation on the same too

    https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_custom_inspection_functions_on_objects

    The inspect method I used is deprecated as per documentation and the correct way to do it is below

    const util = require('util');
    
    class SomeObject{
        constructor(){
            this._varA = "some text";
            this._varB = 12345;
            this._varC = "some more text";
            this._varD = true;
            this._varE = 0.45;
        }
    
        [util.inspect.custom](depth, options) {
            return this.toString();
        }
    
        toString(){
            return "custom textual rapresentation of my object";
        }
    }
    
    var array = [];
    
    array.push(new SomeObject());
    array.push(new SomeObject());
    array.push(new SomeObject());
    
    console.log(array);
    

    Edit: 28th-Mar-2018

    So I launched the script using below

    $ node --inspect-brk=54223 test.js 
    Debugger listening on ws://127.0.0.1:54223/81094440-716b-42a5-895e-4ea2008e0dff
    For help see https://nodejs.org/en/docs/inspector
    

    And then ran a socat forwarder using below

    $ socat -v TCP-LISTEN:54222,fork TCP:127.0.0.1:54223
    

    When you debug the variable array in debugger, you get below output on the socat terminal

    The information is that reconstructed by debugger to give you a meaningful representation.

    Now the v8 debug api has no idea that we want to represent it differently, like we did for console.log. Now there may be something similar in V8 code that does something similar, but looking at the source code, I was not able to figure out there exists such a thing. So you may need to confirm from someone who has V8 debugger api knowledge, if something of this sort exists

    If not the you need to construct something at the IDE level, which again is not a a easy thing to do

    0 讨论(0)
提交回复
热议问题