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}`);
});
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
}
});
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.
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 :)
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]);
});
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é