J'ai cherché partout dans stackoverflow/google, mais je n'arrive pas à comprendre.
Je suis en train de gratter les liens de médias sociaux d'une page d'URL donnée et la fonction renvoie un objet avec une liste d'URL.
Lorsque j'essaie d'écrire ces données dans un fichier différent, il s'affiche dans le fichier sous la forme [object Object]
Au lieu de l'attendu: [' https://Twitter.com/#!/101Cookbooks ',' http://www.facebook.com/101cookbooks '] comme c'est le cas lorsque je console.log()
les résultats.
C’est ma triste tentative de lire et d’écrire un fichier dans Node, en essayant de lire chaque ligne (l’URL) et de la saisir au moyen d’un appel de fonction request(line, gotHTML)
:
fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
console.log(line);
var obj = request(line, gotHTML);
console.log(obj);
fs.writeFileSync('./data.json', obj , 'utf-8');
});
pour référence - la fonction gotHTML
:
function gotHTML(err, resp, html){
var social_ids = [];
if(err){
return console.log(err);
} else if (resp.statusCode === 200){
var parsedHTML = $.load(html);
parsedHTML('a').map(function(i, link){
var href = $(link).attr('href');
for(var i=0; i<socialurls.length; i++){
if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
social_ids.Push(href);
};
};
})
};
return social_ids;
};
obj
est un tableau dans votre exemple.
fs.writeFileSync (nom de fichier, données, [options]) requiert String
ou Buffer
dans le paramètre data. voir documentation .
Essayez d'écrire le tableau dans un format de chaîne:
// writes 'https://Twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8');
Ou:
// writes ['https://Twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');
edit: La raison pour laquelle vous voyez le tableau dans votre exemple est parce que l'implémentation de console.log
_ n'appelle pas simplement toString
, il appelle util.format
voir source console.js
En me basant sur ce que deb2fast a dit, je voudrais également transmettre quelques paramètres supplémentaires à JSON.stringify () pour obtenir un joli format:
fs.writeFile('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');
Le deuxième paramètre est une fonction de remplacement facultative dont vous n’avez pas besoin dans ce cas, donc null
fonctionne.
Le troisième paramètre est le nombre d'espaces à utiliser pour l'indentation. 2 et 4 semblent être des choix populaires.
Si vous obtenez [object object]
, Utilisez JSON.stringify
fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');
Cela a fonctionné pour moi.
D'après mon expérience, JSON.stringify est légèrement plus rapide que util.inspect. J'ai dû enregistrer l'objet de résultat d'une requête DB2 sous forme de fichier json. La requête a renvoyé un objet de 92 000 lignes. La conversion a pris beaucoup de temps à effectuer avec util.inspect. J'ai donc effectué le test suivant en écrivant le même objet d'enregistrement 1000. dans un fichier avec les deux méthodes.
JSON.Stringify
fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
Temps: 3h57 (3 min 57 sec)
Résultat du format:
[
{
"PROB": "00001",
"BO": "AXZ",
"CNTRY": "649"
},
...
]
util.inspect
var util = require('util');
fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
Temps: 4:12 (4 min 12 sec)
Résultat du format:
[ { PROB: '00001',
BO: 'AXZ',
CNTRY: '649' },
...
]
pourriez-vous essayer de faire JSON.stringify (obj);
Comme ça
var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8');
En cas de problème, j'utilise la bibliothèque fs-extra dans node et écris des objets javascript dans un fichier comme celui-ci:
const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);