web-dev-qa-db-fra.com

Comment imprimer un objet dans Node JS

Dans le code ci-dessous (exécuté sur Node JS), j'essaie d'imprimer un objet obtenu à partir d'une API externe en utilisant JSON.stringify ce qui entraîne une erreur:

TypeError: Conversion d'une structure circulaire en JSON

J'ai examiné les questions sur ce sujet, mais aucune n'a pu aider. Quelqu'un pourrait-il suggérer:

a) Comment puis-je obtenir la valeur country de l'objet res?

b) Comment pourrais-je imprimer tout l'objet lui-même?

  http.get('http://ip-api.com/json', (res) => {     
    console.log(`Got response: ${res.statusCode}`);
    console.log(res.country)  // *** Results in Undefined
    console.log(JSON.stringify(res)); // *** Resulting in a TypeError: Converting circular structure to JSON

    res.resume();
  }).on('error', (e) => {
    console.log(`Got error: ${e.message}`);
  });
5
kurrodu

En utilisant le client http request, je peux imprimer l'objet JSON ainsi que la valeur country. Voici mon code mis à jour.

var request = require('request');
request('http://ip-api.com/json', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(response.body);    // Prints the JSON object
    var object = JSON.parse(body);
    console.log(object['country']) // Prints the country value from the JSON object
  }
});
3
kurrodu

De base console.log ne passera pas par un objet long et complexe, et peut décider d'imprimer simplement [Object] au lieu.

Un bon moyen d'empêcher cela dans node.js est d'utiliser util.inspect:

'use strict';
const util = require('util'),
    obj = /*Long and complex object*/;

console.log(util.inspect(obj, {depth: null}));
//depth: null tell util.inspect to open everything until it get to a circular reference, the result can be quite long however.

EDIT: Dans un pincement (dans le REPL par exemple), une deuxième option est JSON.stringify. Pas besoin de require, mais il cassera sur référence circulaire au lieu d'imprimer le fait qu'il y a une référence.

18
DrakaSAN

Imprimez tout l'objet, il n'aura pas de problèmes avec les références récursives:

console.log(res);

Voici un exemple pour voir comment console.log gère les références circulaires:

> var q = {a:0, b:0}
> q.b = q
> console.log(q)
{ a: 0, b: [Circular] }

Aussi, je vous conseille de vérifier quelles données recevez-vous réellement.

Vous pouvez passer deux arguments à console.log ()

Essayez ce code après avoir installé "yargs" Et il imprimera tout l'objet

console.log ('object is', yargs.argv);

Je pense que cela vous aidera à imprimer l'objet entier :)

0
black hat

Cela peut imprimer la clé de l'objet et la valeur de l'objet de la manière la plus simple. Essayez-le.

const jsonObj = {
  a: 'somestring',
  b: 42,
  c: false
};

Array.from(Object.keys(jsonObj)).forEach(function(key){
  console.log(key + ":" + jsonObj[key]);
});
0

Vous n'obtenez pas réellement de données dans res. Vous avez besoin de on('data') et on.('end')

body est une chaîne. Il s'ajoute aux données reçues, donc une fois terminé, vous devrez analyser les données dans json

http.get("http://ip-api.com/json", function(res) {
    var body = '';
    res.on('data', function(data){
        body = body + data;
    });

    res.on('end', function() {
        var parsed = {};  
        try{
            parsed = JSON.parse(body); // i have checked its working correctly
        }
        catch(er){
            //do nothing it is already json
        }
        console.log(parsed.country);
    });
});

Noe de parsed qui est un objet json, vous pouvez obtenir n'importe quelle propriété

0
Sami