web-dev-qa-db-fra.com

Écrire des objets dans un fichier avec Node.js

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;
};
62
sarahbkim

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.formatvoir source console.js

56
Jim Schubert

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.

75
Guy

Si vous obtenez [object object], Utilisez JSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

Cela a fonctionné pour moi.

17
deb2fast

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.

  1. 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"
   },
  ...
]
  1. 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' },
    ...
]
9
Netsmile

pourriez-vous essayer de faire JSON.stringify (obj);

Comme ça

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 
2
Navvye Anand

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); 
0
tljw86