Node.js를 사용하여 파일에 개체 쓰기


82

나는 이것을 위해 stackoverflow / google 전체를 검색했지만 알아낼 수 없습니다.

주어진 URL 페이지의 소셜 미디어 링크를 스크랩하고 있으며 함수는 URL 목록이있는 개체를 반환합니다.

이 데이터를 다른 파일에 쓰려고 [object Object]하면 예상 한 대신 파일로 출력됩니다 . [ ' https://twitter.com/#!/101Cookbooks ', ' http://www.facebook.com/ 101cookbooks '] console.log()결과 가 나올 때처럼 .

이것은 Node에서 파일을 읽고 쓰려는 슬픈 시도입니다. 각 줄 (URL)을 읽고 함수 호출을 통해 입력하려고합니다 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'); 
});   

참고로- 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;
};

3
[object Object]객체 toString입니다. 객체를 표현하려면을 사용하십시오 JSON.stringify.
elclanrs 2014

2
조심하세요 JSON.stringify. 배열을 사용하면 안전하지만 개체에 순환 참조가 있으면 실패합니다 ( 이 항목 참조 ). util모듈 순환 참조를 처리한다.
Jim Schubert 2014

답변:


70

obj 귀하의 예에서 배열입니다.

fs.writeFileSync (filename, data, [options]) 에는 String또는 Bufferdata 매개 변수 가 필요합니다 . 문서를 참조하십시오 .

배열을 문자열 형식으로 작성하십시오.

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

또는:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');

편집 : 예제에서 배열을 보는 이유는 노드의 구현이를 console.log호출하는 것이 아니라 console.js 소스를toString 호출하기 때문입니다.util.format


5
개체에 큰 배열이 포함 된 경우 검사 방법이 "45000 more ...]"와 같은 출력을 출력하므로 작동하지 않습니다.
Coxer

96

deb2fast가 말한 것을 기반으로 JSON.stringify ()에 몇 가지 추가 매개 변수를 전달하여 예쁜 형식으로 만듭니다.

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

두 번째 매개 변수는이 경우 필요하지 않은 선택적 대체 함수이므로 null작동합니다.

세 번째 매개 변수는 들여 쓰기에 사용할 공백 수입니다. 2와 4가 인기있는 선택 인 것 같습니다.


순환 의존성 문제를 일으킬 것입니다. 양방향 종속성을 JSON으로 변환 할 수 없습니다.
Ozan Ertürk

작성된 텍스트 파일에 파일 끝에 개행 문자가 없습니다. 이 문제를 해결할 방법이 있습니까?
friederbluemle

1
@friederbluemle- + '\n'stringify () 호출에 새 줄을 추가 할 수 있습니다.
Guy

1
이것은 받아 들인 대답을 사용하여 잘못된 결과를 얻었 기 때문에 가장 잘 작동했습니다.
Anshuman Kumar

20

당신이 얻는 [object object]다면 다음을 사용하십시오.JSON.stringify

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

그것은 나를 위해 일했습니다.


10

내 경험상 JSON.stringify는 util.inspect보다 약간 빠릅니다. DB2 쿼리의 결과 개체를 json 파일로 저장해야했는데 쿼리가 92k 행의 개체를 반환했고 util.inspect로 변환을 완료하는 데 시간이 너무 오래 걸렸으므로 동일한 1000 개 레코드 개체를 작성하여 다음 테스트를 수행했습니다. 두 가지 방법으로 파일에.

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
    

시간 : 3:57 (3 분 57 초)

결과 형식 :

[
  {
    "PROB": "00001",
    "BO": "AXZ",
    "CNTRY": "649"
   },
  ...
]
  1. util.inspect

    var util = require('util');
    fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
    

시간 : 4:12 (4 분 12 초)

결과 형식 :

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]

4

JSON.stringify (obj);

이렇게

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

1

다른 사람이 이것을 우연히 발견하는 경우를 대비하여 노드에서 fs-extra 라이브러리를 사용하고 다음과 같은 파일에 javascript 객체를 작성합니다.

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.