Cómo utilizar la consola en Node.js

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Usando console.log, console.info, yconsole.debug
    1. %s
    2. %d, %f, %i,%o
    3. %c
  • Usandoconsole.table
    1. Matrices
    2. Objetos
  • Usandoconsole.dir
  • Usandoconsole.dirxml
  • Usandoconsole.assert
  • Usando console.erroryconsole.warn
  • Usandoconsole.trace(label)
  • Usandoconsole.count(label)
  • Usandoconsole.countReset(label)
  • Usando console.time(label)yconsole.timeEnd(label)
  • Conclusión
  • En este artículo, aprenderemos cómo utilizar la mayoría de los métodos disponibles en la consoleclase Node.js de manera más efectiva.

    Prerrequisitos

    Este tutorial fue verificado con el navegador Chrome versión 70.0.3538.77 y Node.js versión 8.11.3.

    Usando console.log, console.info, yconsole.debug

    El console.logmétodo imprime en la salida estándar, ya sea la terminal o la consola del navegador. Genera cadenas de manera predeterminada, pero se puede utilizar junto con cadenas de plantilla para modificar lo que devuelve.

    console.log(string, substitution)

    console.infoy console.debuglos métodos son idénticos a console.log en su funcionamiento.

    Puedes usarlo console.debugen la consola del navegador Firefox de forma predeterminada, pero para usarlo en Chrome, tendrás que configurar el nivel de registro en Verbose activándolo en el menú Todos los niveles .

    Los argumentos en la cadena de plantilla se pasan a util.format, que luego procesa los argumentos reemplazando cada token de sustitución con el valor convertido respectivo.

    Los tokens de sustitución admitidos son:

    %s

    const msg = `Using the console class`;console.log('%s', msg);console.log(msg);

    Este código generaría el siguiente resultado:

    OutputUsing the console classUsing the console class

    %ses el patrón de sustitución predeterminado.

    %d, %f, %i,%o

    const circle = (radius = 1) = {  const profile = {};  const pi = 22/7;  profile.diameter = 2 * pi * radius;  profile.circumference = pi * radius * 2;  profile.area = pi * radius * 2;  profile.volume = 4/3 * pi * radius^3;  console.log('This circle has a radius of: %d cm', radius);  console.log('This circle has a circumference of: %f cm', profile.diameter);  console.log('This circle has an area of: %i cm^2', profile.area);  console.log('The profile of this cirlce is: %o', profile);  console.log('Diameter %d, Area: %f, Circumference %i', profile.diameter, profile.area, profile.circumference)}circle();

    Este código generaría el siguiente resultado:

    OutputThis circle has a radius of: 1 cmThis circle has a circumference of: 6.285714285714286 cmThis circle has an area of: 6 cm^2The profile of this cirlce is: {diameter: 6.285714285714286, circumference: 6.285714285714286, area: 6.285714285714286, volume: 7}Diameter 6, Area: 6.285714285714286, Circumference 6
    • %dserá sustituido por un dígito (entero o flotante).
    • %fserá reemplazado por un valor flotante.
    • %iserá reemplazado por un entero.
    • %oserá reemplazado por un Objeto.

    %oes especialmente útil porque no tenemos que usarlo JSON.stringifypara expandir nuestro objeto porque muestra todas las propiedades del objeto por defecto.

    Tenga en cuenta que puede utilizar tantas sustituciones de tokens como desee. Se reemplazarán en el mismo orden que los argumentos que pase.

    %c

    Este token de sustitución aplica estilos CSS al texto sustituido.

    console.log('LOG LEVEL: %c OK', 'color: green; font-weight: normal');console.log('LOG LEVEL: %c PRIORITY', 'color: blue; font-weight: medium');console.log('LOG LEVEL: %c WARN', 'color: red; font-weight: bold');console.log('ERROR HERE');

    Este código generaría el siguiente resultado:

    El texto que pasamos console.logdespués del %ctoken de sustitución se ve afectado por los estilos, pero el texto anterior se deja como está sin estilo.

    Usandoconsole.table

    El primer argumento que se le pasa son los datos que se devolverán en forma de tabla. El segundo es una matriz de columnas seleccionadas que se mostrarán.

    console.table(tabularData, [properties])

    Este método imprimirá la entrada que se le pase formateada como una tabla y luego registrará el objeto de entrada después de la representación de la tabla.

    Matrices

    Si se le pasa una matriz como datos, cada elemento de la matriz será una fila en la tabla.

    const books = ['The Silmarillion', 'The Hobbit', 'Unfinished Tales'];console.table(books);

    En una matriz simple con una profundidad de 1, la primera columna de la tabla tiene el índice de encabezado. Debajo del encabezado de índice de la primera columna se encuentran los índices de la matriz y los elementos de la matriz se enumeran en la segunda columna, debajo del encabezado de valor.

    Esto es lo que sucede con una matriz anidada:

    const authorsAndBooks = [['Tolkien', 'Lord of The Rings'],['Rutger', 'Utopia For Realists'], ['Sinek', 'Leaders Eat Last'], ['Eyal', 'Habit']];console.table(authorsAndBooks);

    Objetos

    Para los objetos con una profundidad de 1, las claves del objeto se enumerarán debajo del encabezado del índice y los valores del objeto debajo del encabezado de la segunda columna.

    const inventory = { apples: 200, mangoes: 50, avocados: 300, kiwis: 50 };console.table(inventory);

    Para objetos anidados:

    const forexConverter = { asia: { rupee: 1.39, renminbi: 14.59 , ringgit: 24.26 }, africa: { rand: 6.49, nakfa: 6.7 , kwanza:0.33 }, europe: { swissfranc: 101.60, gbp: 130, euro: 115.73 } };console.table(forexConverter);

    Algunos objetos más anidados,

    const workoutLog = { Monday: { push: 'Incline Bench Press', pull: 'Deadlift'}, Wednesday: { push: 'Weighted Dips', pull: 'Barbell Rows'}};console.table(workoutLog);

    Aquí, especificamos que solo queremos ver los datos bajo la columna push.

    console.table(workoutLog, 'push');

    Para ordenar los datos de una columna, simplemente haga clic en el encabezado de la columna.

    Bastante útil, ¿verdad?

    ¡Intenta pasar console.tableun objeto con algunos valores como matrices!

    Usandoconsole.dir

    El primer argumento que se pasa a esta función es el objeto que se va a registrar, mientras que el segundo es un objeto que contiene opciones que definirán cómo se formateará la salida resultante o qué propiedades del objeto se mostrarán.

    Lo que se devuelve es un objeto formateado por la función util.inspect del nodo.

    Los objetos anidados o secundarios dentro del objeto de entrada se pueden expandir mediante triángulos de divulgación.

    console.dir(object, options);// where options = { showHidden: true ... }

    Veamos esto en acción.

    const user = {  details: {    name: {      firstName: 'Immanuel',      lastName: 'Kant'    },    height: `1.83m"`,    weight: '90kg',    age: '80',    occupation: 'Philosopher',    nationality: 'German',    books: [      {        name: 'Critique of Pure Reason',        pub: '1781',      },      {        name: 'Critique of Judgement',        pub: '1790',      },      {        name: 'Critique of Practical Reason',        pub: '1788',      },      {        name: 'Perpetual Peace',        pub: '1795',      },    ],    death: '1804'  }}console.dir(user);

    Aquí está en la consola de Chrome.

    Usandoconsole.dirxml

    Esta función generará un árbol interactivo del XML/HTML que se le pasa. De manera predeterminada, se utiliza un objeto Javascript si no es posible generar el árbol de nodos.

    console.dirxml(object|nodeList);

    Al igual que console.dir, el árbol renderizado se puede expandir haciendo clic en los triángulos de divulgación dentro de los cuales se pueden ver los nodos secundarios.

    Su salida es similar a la que encontramos en la pestaña Elementos del navegador.

    Así es como se ve cuando pasamos algo de HTML desde una página de Wikipedia.

    const toc = document.querySelector('#toc');console.dirxml(toc);

    Pasemos algo de HTML desde una página de este sitio web.

    console.dirxml(document)

    Así es como se ve cuando pasamos un objeto.

    ¡Prueba a llamar console.dira algún HTML y mira qué sucede!

    Usandoconsole.assert

    El primer argumento que se pasa a la función es un valor que se debe probar como verdadero. Todos los demás argumentos que se pasan se consideran mensajes que se deben imprimir si el valor pasado no se evalúa como verdadero.

    El Node REPL generará un error que detendrá la ejecución del código posterior.

    console.assert(value, [...messages])

    He aquí un ejemplo básico:

    1. console.assert(false, 'Assertion failed');
    OutputAssertion failed: Assertion failed

    Ahora, vamos a divertirnos un poco. Construiremos un mini marco de prueba usandoconsole.assert

    const sum = (a = 0, b = 0) = Number(a) + Number(b);function test(functionName, actualFunctionResult, expected) {  const actual = actualFunctionResult;  const pass = actual === expected;  console.assert(pass, `Assertion failed for ${functionName}`);  return `Test passed ${actual} === ${expected}`;}console.log(test('sum', sum(1,1), 2)); // Test passed 2 === 2console.log(test('sum', sum(), 0));    // Test passed 0 === 0console.log(test('sum', sum, 2));      // Assertion failed for sumconsole.log(test('sum', sum(3,3), 4)); // Assertion failed for sum

    Ejecute lo anterior en el REPL de su nodo o en la consola del navegador para ver qué sucede.

    Usando console.erroryconsole.warn

    Estos dos son básicamente idénticos. Ambos imprimirán cualquier cadena que se les pase.

    Sin embargo, console.warnimprime un símbolo de advertencia de triángulo antes de que se transmita el mensaje:

    console.warn(string, substitution);

    Mientras console.errorimprime un símbolo de peligro antes de que pase el mensaje.

    console.error(string, substitution);

    Observemos que la sustitución de cadenas se puede aplicar de la misma manera que el console.logmétodo.

    Aquí hay una mini función de registro que utiliza console.error.

    const sum = (a = 0, b = 0) = Number(a) + Number(b);function otherTest(actualFunctionResult, expected) {  if (actualFunctionResult !== expected) {    console.error(new Error(`Test failed ${actualFunctionResult} !== ${expected}`));  } else {    // pass  }}otherTest(sum(1,1), 3);

    Usandoconsole.trace(label)

    Este método de consola imprimirá la cadena Trace:seguida de la etiqueta pasada a la función y luego el seguimiento de la pila hasta la posición actual de la función.

    function getCapital(country) {  const capitalMap = {    belarus: 'minsk', australia: 'canberra', egypt: 'cairo', georgia: 'tblisi', latvia: 'riga', samoa: 'apia'  };  console.trace('Start trace here');  return Object.keys(capitalMap).find(item = item === country) ? capitalMap[country] : undefined;}console.log(getCapital('belarus'));console.log(getCapital('accra'));

    Usandoconsole.count(label)

    El conteo comenzará e incrementará un contador de nombre label.

    Construyamos un contador de palabras para ver cómo funciona.

    const getOccurences = (word = 'foolish') = {  const phrase = `Oh me! Oh life! of the questions of these recurring, Of the endless trains of the faithless, of cities fill’d with the foolish, Of myself forever reproaching myself, for who more foolish than I, and who more faithless?`;  let count = 0;  const wordsFromPhraseArray = phrase.replace(/[,.!?]/igm, '').split(' ');  wordsFromPhraseArray.forEach((element, idx) = {    if (element === word) {      count ++;      console.count(word);    }  });  return count;}getOccurences();
    getOccurences('foolish');

    Aquí vemos que la palabra foolishse registró dos veces: una por cada aparición de la palabra en la frase.

    [secondary_label]foolish: 1foolish: 22

    Podríamos usar esto como un método útil para ver cuántas veces se llamó a una función o cuántas veces se ejecutó una línea en nuestro código.

    Usandoconsole.countReset(label)

    Como sugiere el nombre, esto restablece un contador que tiene un labelconjunto mediante el console.countmétodo.

    const getOccurences = (word = 'foolish') = {  const phrase = `Oh me! Oh life! of the questions of these recurring, Of the endless trains of the faithless, of cities fill’d with the foolish, Of myself forever reproaching myself, for who more foolish than I, and who more faithless?`;  let count = 0;  const wordsFromPhraseArray = phrase.replace(/[,.!?]/igm, '').split(' ');  wordsFromPhraseArray.forEach((element, idx) = {    if (element === word) {      count ++;      console.count(word);      console.countReset(word);    }  });  return count;}getOccurences();
    getOccurences('foolish');
    [secondary_label]foolish: 1foolish: 12

    Podemos ver que nuestra getOccurencesfunción devuelve 2 porque de hecho hay dos apariciones de la palabra foolishen la frase, pero como nuestro contador se reinicia en cada coincidencia, se registra foolish: 1dos veces.

    Usando console.time(label)yconsole.timeEnd(label)

    La console.timefunción inicia un temporizador con el labelproporcionado como argumento a la función, mientras que la console.timeEndfunción detiene un temporizador con el labelproporcionado como argumento a la función.

    console.time('timer-label');console.timeEnd('timer-label');

    Podemos usarlo para calcular cuánto tiempo tomó ejecutar una operación pasando el mismo labelnombre a ambas funciones.

    const users = ['Vivaldi', 'Beethoven', 'Ludovico'];const loop = (array) = {  array.forEach((element, idx) = {    console.log(element);  })}const timer = () = {  console.time('timerLabel');  loop(users);  console.timeEnd('timerLabel');}timer();

    Podemos ver la etiqueta del temporizador mostrada contra el valor del tiempo después de que el temporizador se detiene.

    OutputVivaldiBeethovenLudovicotimerLabel: 0.69091796875ms

    La función de bucle tardó 0,6909 ms en terminar de recorrer la matriz.

    Conclusión

    Por fin llegamos al final de este tutorial.

    Tenga en cuenta que este tutorial no cubrió usos no estándar de la consoleclase como console.profile, console.profileEnd, y console.timeLog.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion