2014-09-14 5 views
0

좋아 나는이 JSON 파일이 있습니다읽고 Node.js를에서 JSON 파일을 작성

{ 
    "joe": { 
     "name": "joe", 
     "lastName": "black" 
    }, 

    "matt": { 
     "name": "matt", 
     "lastName": "damon" 
    } 
} 

을 나는 Node.js를 가진 사람을 추가 할 :

{ 
    "joe": { 
     "name": "joe", 
     "lastName": "black" 
    }, 

    "matt": { 
     "name": "matt", 
     "lastName": "damon" 
    }, 

    "brad": { 
     "name": "brad", 
     "lastName": "pitt" 
    } 
} 

를 아래 코드로 json 문서를 읽고, 구문 분석하고, 사람을 추가 한 다음 다시 파일에 쓰려고합니다. 그러나 파싱 된 객체 (jsonObj)는 쓰기 함수에서 인식되지 않습니다. 이벤트 루프와 관련이 있다는 것을 알고 있지만 어떻게 해결해야할지 모르겠습니다. process.nextTick을 사용해 보았지만 작동시키지 못했습니다.

var jsonObj; 

fs.open('files/users.json', 'r+', function opened(err, fd) { 
    if (err) { 
     throw err; 
    } 
    var readBuffer = new Buffer(1024), 
     bufferOffset = 0, 
     readLength = readBuffer.length, 
     startRead = 0; 
    fs.read(fd, readBuffer, bufferOffset, readLength, startRead, function read(err, readBytes) { 
     if (err) { 
      throw err; 
     } 
     if (readBytes > 0) { 
      jsonObj = JSON.parse(readBuffer.slice(0, readBytes).toString()); 
      jsonObj["brad"] = {}; 
      jsonObj["brad"].name = "brad"; 
      jsonObj["brad"].lastName = "pitt"; 
     **//Until here it works fine and the 'jsonObj' is properly updated** 
     } 
    }); 
}); 

process.nextTick(function() { 
    var writeBuffer, 
     startWrite = 0, 
     bufferPosition = 0, 
     writeLength; 
    fs.open('files/users.json', 'r+', function opened(err, fd) { 
     if (err) { 
      throw err; 
     } 
     ***//Below I get the 'jsonObj is undefined' error*** 
     writeBuffer = new Buffer(JSON.stringify(jsonObj.toString(), null, '/\t/')); 
     writeLength = writeBuffer.length; 
     fs.write(fd, writeBuffer, bufferPosition, writeLength, startWrite, function wrote(err, written) { 
      if (err) { 
       throw err; 
      } 
     }); 
    }); 
}); 

답변

6

당신은 require JSON 파일 수 :

var fs = require('fs'); 
var users = require('./names'); 

users.brad = { 
    name: 'brad', 
    lastName: 'pitt' 
} 

var string = JSON.stringify(users,null,'\t'); 

fs.writeFile('./names.json',string,function(err) { 
    if(err) return console.error(err); 
    console.log('done'); 
}) 

옵션 비동기 버전을 필요로하지 않고 :

var fs = require('fs'); 

fs.readFile('./names.json',{encoding: 'utf8'},function(err,data) { 
    var users = JSON.parse(data); 
    users.brad2 = { name: 'brad', lastName: 'pitt' }; 
    var string = JSON.stringify(users,null,'\t'); 

    fs.writeFile('./names.json',string,function(err) { 
    if(err) return console.error(err); 
    console.log('done'); 
    }) 
}) 
2

간단한 힌트 : process.nextTick을 사용해야하는 경우에 문제가 있습니다. 라이브러리 프로그래머에게 그 기능을 맡겨라! : 해당 파일을 읽을 때까지

그냥 기다리지 않습니다 Until here...

nextTick 당신이 nextTick 콜 기능을 이동 (즉, 몇 hundret 틱 걸릴 수 있습니다!), 그냥 다음 틱을 기다립니다. 그리고 fs.read이라고하는 나노초가 가능합니다. fs.read 이후에 커널이 파일에 대한 정보를 반환하거나 누군가 다음 번 진드기에서해야 할 일을 알려줄 때까지 nodejs 메인 루프가 유휴 상태이기 때문입니다. 노드에서

+0

잘 더 도움이 대답은 아니 ... 롤 – Mcs

+0

아주 잘 작동하는의 setTimeout 될 것이다 setTimeout을 사용하지 마십시오 – david

+0

setTimeOut (theWriteFunction, 100)을 읽는다면 왜 읽지 않습니다. 작동합니까? – Mcs

관련 문제