Как изменить строковое представление экземпляра объекта в консоли отладки nodejs. Есть ли метод (например, toString() в .NET), который я могу переопределить?
Рассмотрим следующий код:
class SomeObject{
constructor(){
this._varA = "some text";
this._varB = 12345;
this._varC = "some more text";
this._varD = true;
this._varE = 0.45;
}
toString(){
return "custom textual rapresentation of my object";
}
}
var array = [];
array.push(new SomeObject());
array.push(new SomeObject());
array.push(new SomeObject());
console.info(array);
Однако в других средах и языках программирования, над которыми я работал, переопределение метода toString() показало бы результат toString() (в приведенном выше примере "custom textual representation of my object") вместо динамического текстового представления, созданного отладчиком (в приведенном выше примере кода это: SomeObject {_varA: "some text", _varB: 12345, _varC: "some more text", …}) - в чем я ни на минуту не сомневаюсь, это очень полезно, когда пользовательская альтернатива не определена.
Я также понимаю, что console.info(array.toString()); или даже console.info(array.map(t=>t.toString())); будут создавать что-то похожее на то, что мне нужно, однако это мешает мне перемещаться по объектам с помощью навигации отладки, т.е. детализировать граф объекта.
Если это невозможно, принесут ли это пользу другим? Если есть достаточный интерес, я могу рассмотреть возможность определения и реализации его как функции.
И что-то вроде этого? array.forEach(t=>{console.info(t.toString() + ":",t)});. Это не идеально, но мы могли бы создать модуль узла для обработки таких ситуаций. Например, создайте модуль, который проверяет аргумент и воздействует на тип :)
@GuyT - спасибо за предложение, но оно не идеально. На мой взгляд, консоль отладки (как показано на втором рисунке в моем сообщении) должна отображать: SomeObject { "custom textual rapresentation of my object" } вместо SomeObject {_varA: "some text", _varB: 12345, _varC: "some more text", …}.
Я понимаю вашу точку зрения, еще одно неидеальное решение - array.forEach( el => {console.groupCollapsed(el.toString()); console.info(el); console.groupEnd();});. Пс. Я понимаю, каково ваше видение решения ..;)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Существует метод toString (), который вы вызываете для другой строки.
terms[200]._text.toString()
Вы также можете искать JSON.stringify(), который я считаю чрезвычайно полезным при отладке. Поскольку объекты JavaScript буквально представляют собой JSON, это упростит их вывод на консоль.
console.info(JSON.stringify(terms[200]))
Если вы собираетесь проголосовать против, оставьте причину, по которой я могу улучшить свой ответ.
Я не уверен, но думаю, что это, вероятно, потому, что ваш ответ не является правильным ответом на мой вопрос ... Это, вероятно, отчасти и моя проблема, я обновлю вопрос, чтобы быть более ясным ... Извините.
Когда вы делаете console.info, он внутренне вызывает formatValue в util.js, для которого есть проверка ниже
const maybeCustomInspect = value[customInspectSymbol] || value.inspect;
Это означает, что если у вашего значения есть метод inspect, он вызывается, а затем вы можете вернуть toString тем же самым. Так что измените свой код на
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.info(array);
Делает это печатать
[ custom textual rapresentation of my object,
custom textual rapresentation of my object,
custom textual rapresentation of my object ]
У Nodejs тоже есть документация
https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_custom_inspection_functions_on_objects
Метод inspect, который я использовал, устарел согласно документации, и правильный способ сделать это приведен ниже.
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.info(array);
Обновлено: 28 марта 2018 г.
Итак, я запустил скрипт, используя ниже
$ 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
А затем запустил пересылку socat, используя нижеприведенную
$ socat -v TCP-LISTEN:54222,fork TCP:127.0.0.1:54223
Когда вы отлаживаете переменную array в отладчике, вы получаете следующий вывод на терминале socat
Информация восстанавливается отладчиком, чтобы дать вам осмысленное представление.
Теперь api отладки v8 не знает, что мы хотим представить его иначе, как мы это сделали для console.info. Возможно, в коде V8 есть что-то похожее, но, глядя на исходный код, я не смог понять, что такое существует. Таким образом, вам может потребоваться подтверждение от кого-то, кто знает api отладчика V8, если что-то в этом роде существует.
Если не то, что вам нужно создать что-то на уровне IDE, что опять же непросто.
Я пробовал это, и это не влияет на то, как консоль отладки отображает объекты ...
Ваше редактирование смутило меня тем, что вы искали только Console.log, сейчас я проверяю часть отладчика
спасибо за ответ и редактирование - меня интересует только, чтобы это работало в отладчике vscode / vscode. Извините, я должен был упомянуть, что в теле моего вопроса вместо того, чтобы полагаться только на теги ... В любом случае, у вас есть +1 от меня :)
Это наиболее близкий ответ на мой вопрос. Это не решение моей проблемы, но оно ясное и полезное, поэтому я наградил его наградой. Спасибо @TarunLalwani
Мои два цента: Как насчет того, чтобы переопределить функцию console.info, чтобы она делала то, что вы хотите. Вот POC, которому нужна функция _toString в любом объекте, чтобы изменить способ его отображения в журнале.
создайте файл logger.js следующего содержания:
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.info
console.info = function(x){console._log(getUpdatedLogObj({...x}))}
импортировать его в index.js
require('./logger')
console.info({a: 1, b: 2, c: {d: 5, e: 6, _toString: function(){return 'fromToString'}}})
И вы по-прежнему получаете навигацию:

> Я также понимаю, что console.info (array.toString ()); или даже console.info (array.map (t => t.toString ())); создаст что-то похожее на то, что мне нужно, однако это мешает мне перемещаться по объектам с помощью навигации отладки, т.е. детализировать граф объекта.
имя _toString может вводить в заблуждение, но вы по-прежнему получаете навигацию с указанной выше реализацией: обновлен ответ с помощью снимка
спасибо за ответ, но это не дает подходящего решения на мой вопрос.
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.info(array);
как это поможет?
В VS Code была добавлена новая опция, позволяющая настраивать вывод отладчика: просто добавьте ниже в конфигурацию запуска
"customDescriptionGenerator": "function (def) { if (this.toString) { const _v = this.toString(); if (_v.indexOf(\"[object Object]\") < 0) return _v; } return def; }",
Виола: ваши объекты просматриваются с помощью "toString" в часах, сохраняя возможность детализации и т. д.
Добавил это как проблему на GitHub - github.com/Microsoft/vscode/issues/46829