1257 votes

Comment puis-je obtenir l'objet complet dans la console.log() de Node.js, plutôt que '[Object]' ?

J'ai cet objet :

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};

Mais quand j'essaie de le montrer en utilisant console.log(myObject) je reçois ce message :

{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }

Comment puis-je obtenir l'objet complet, y compris le contenu de la propriété f ?

1937voto

250R Points 5600

Vous devez utiliser util.inspect() :

const util = require('util')

console.log(util.inspect(myObject, {showHidden: false, depth: null, colors: true}))

// alternative shortcut
console.log(util.inspect(myObject, false, null, true /* enable colors */))

Sorties

{ a: 'a',  b: { c: 'c', d: { e: 'e', f: { g: 'g', h: { i: 'i' } } } } }

Ver util.inspect() docs .

817voto

squint Points 28293

Vous pouvez utiliser JSON.stringify et obtenir une indentation agréable ainsi qu'une syntaxe peut-être plus facile à mémoriser.

console.log(JSON.stringify(myObject, null, 4));

{
    "a": "a",
    "b": {
        "c": "c",
        "d": {
            "e": "e",
            "f": {
                "g": "g",
                "h": {
                    "i": "i"
                }
            }
        }
    }
}

Le troisième argument définit le niveau d'indentation, vous pouvez donc l'ajuster comme vous le souhaitez.

Plus de détails ici dans JSON stringify MDN docs si nécessaire.

582voto

mklement0 Points 12597

Une compilation des nombreuses réponses utiles de (au moins) Node.js v0.10.33 (stable) / v0.11.14 (instable) vraisemblablement à travers (au moins) v7.7.4 (la version actuelle est celle de la dernière mise à jour de cette réponse). Coup de chapeau à Rory O'Kane pour son aide.

tl;dr

Pour obtenir la sortie souhaitée pour l'exemple de la question, utilisez console.dir() :

console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion

Pourquoi pas ? util.inspect() ? Parce que c'est déjà au cœur de la sortie du diagnostic : console.log() y console.dir() ainsi que le REPL Node.js utiliser util.inspect() implicitement . C'est généralement no nécessaire pour require('util') et appeler util.inspect() directement.

Détails ci-dessous.


  • console.log() (et son alias, console.info() ):

    • Si le 1er argument n'est PAS une chaîne de format : util.inspect() est automatiquement appliqué à chaque argument :
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log(o, [1,2,3]) // -> '{ one: 1, two: 'deux', foo: [Function] } [ 1, 2, 3 ]'
      • Notez que vous ne peut pas passer les options par le biais de util.inspect() dans ce cas, ce qui implique 2 limitations notables :
        • Structurelle profondeur de la sortie est limité à 2 niveaux (par défaut).
          • Puisque vous ne pouvez pas changer cela avec console.log() vous devez plutôt utiliser console.dir() : console.dir(myObject, { depth: null } Imprimés avec illimité profondeur ; voir ci-dessous.
        • Vous ne pouvez pas allumer la coloration syntaxique.
    • Si le 1er argument EST une chaîne de format (voir ci-dessous) : utilise util.format() pour imprimer les arguments restants en fonction de la chaîne de format (voir ci-dessous) ; par exemple :
      • o = { one: 1, two: 'deux', foo: function(){} }; console.log('o as JSON: %j', o) // -> 'o as JSON: {"one":1,"two":"deux"}'
      • Note :
        • Il n'y a pas de placeholder pour représenter objets util.inspect() -style.
        • JSON généré avec %j n'est PAS joliment imprimée.
  • console.dir() :

    • Accepte uniquement 1 argument pour inspecter et s'applique toujours util.inspect() - essentiellement, une enveloppe pour util.inspect() sans options par défaut ; par exemple :
      • o = { one: 1, two: 'deux', foo: function(){} }; console.dir(o); // Effectively the same as console.log(o) in this case.
    • Node.js v0.11.14 et plus : Le 2ème argument facultatif spécifie options pour util.inspect() - voir ci-dessous ; par exemple :
      • console.dir({ one: 1, two: 'deux'}, { colors: true }); // Node 0.11+: Prints object representation with syntax coloring.
  • Le REPL : imprime implicitement la valeur de retour de toute expression avec util.inspect() avec coloration syntaxique ;
    c'est-à-dire qu'il suffit de taper le nom d'une variable et d'appuyer sur Entrée pour imprimer une version inspectée de sa valeur ; par ex :

    • o = { one: 1, two: 'deux', foo: function(){} } // The REPL echoes the object definition with syntax coloring.

util.inspect() automatiquement les jolis dessins objet y tableau représentations mais produit multiligne sortie uniquement en cas de besoin .

  • Le comportement de l'impression peut être contrôlé par l'option compact dans l'option options argument ; false utilise la sortie multi-ligne sans condition alors que true désactive complètement la fonction de pretty-printing ; elle peut également être définie comme une valeur de numéro (la valeur par défaut est 3 ) pour contrôler le comportement conditionnel multi-lignes - voir les docs .

  • Par défaut, la sortie est enveloppée à environ 60 caractères Merci, Shrey indépendamment du fait que la sortie soit envoyée vers un fichier ou un terminal. En pratique, puisque les coupures de ligne ne se produisent qu'aux limites de la propriété vous obtiendrez souvent des lignes plus courtes, mais elles peuvent aussi être plus longues (par exemple, avec de longues valeurs de propriété).

  • Dans la version 6.3.0+, vous pouvez utiliser la fonction breakLength pour passer outre la limite de 60 caractères ; si vous la définissez comme suit Infinity tout est publié sur un simple ligne.

Si vous souhaitez avoir plus de contrôle sur les jolies impressions, envisagez d'utiliser JSON.stringify() avec un 3ème argument mais notez ce qui suit :

  • Échecs avec des objets qui ont références circulaires comme module dans le contexte mondial.
  • Méthodes (fonctions) ne seront PAS incluses.
  • Vous ne pouvez pas choisir de montrer les propriétés cachées (non énumérables).
  • Exemple d'appel :
    • JSON.stringify({ one: 1, two: 'deux', three: true}, undefined, 2); // creates a pretty-printed multiline JSON representation indented with 2 spaces

util.inspect() objet options (2ème argument) :

Une option options peut être passé pour modifier certains aspects de la chaîne formatée ; algunos des propriétés prises en charge sont :

Ver les derniers documents de Node.js pour la liste complète actuelle.

  • showHidden

    • si true puis les propriétés non énumérables de l'objet [celles qui sont désignées pour ne pas apparaître lorsque l'on utilise for keys in obj o Object.keys(obj) ] seront également affichés. La valeur par défaut est false .
  • depth

    • indique à inspecter combien de fois il faut reculer lors du formatage de l'objet. Ceci est utile pour inspecter de grands objets compliqués. La valeur par défaut est 2. Pour que la récursion soit illimitée, passez la valeur null .
  • colors

    • si vrai, alors la sortie sera stylisée avec les codes de couleur ANSI. La valeur par défaut est false . Les couleurs sont personnalisables [ - voir lien].
  • customInspect

    • si false puis personnalisé inspect() les fonctions définies sur les objets inspectés ne seront pas appelées. La valeur par défaut est true .

util.format() caractères de remplacement pour les chaînes de format (1er argument)

Quelques des caractères de remplacement pris en charge sont :

Ver les derniers documents sur Node.js pour la liste complète actuelle.

  • %s - String.
  • %d - Nombre (à la fois entier et flottant).
  • %j - JSON.
  • %% - un seul signe de pourcentage ('%'). Ceci ne consomme pas d'argument.

68voto

Nikhil M Points 376

Une autre méthode simple consiste à le convertir en json

console.log('connection : %j', myObject);

53voto

Hirra Points 15

Essayez ça :

console.dir(myObject,{depth:null})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X