2017-05-05 5 views
0

에 유효한 문자열을 반환, 나는 init 기능이 : fs.readFileSync은 때때로 특정 상황 내 노드 응용 프로그램에서

SyntaxError: Unexpected end of JSON input

그래서 나는 vscode에서 디버깅 및 변수 contentreadFileSync는 빈 문자열을 반환하는 것을 의미 빈 문자열이 포함 된 것을 발견했다.

이제 이상한 점이 있습니다. cmd 또는 git bash (일반 모드 또는 디버그) 또는 vscode의 디버그 모드에서 시작된 경우에는 작동하지 않지만 vscode에서 디버거를 다시 시작하면 (시작 및 중지하지 않지만 실제로 재시작 버튼을 누르는 경우) 작동하지 않습니다. json 파일의 내용을 매번 readFileSync에서 반환 된 문자열로 수정하십시오.

업데이트 : schedule.json 파일을 삭제 한 다음 코드를 실행 해 보았습니다. 실제로는 if(!fs.existsSync("../schedule.json")) 진술을 입력하지 않은 것으로 나타났습니다. 캐싱 버그와 거의 같습니다. 일이 비동기 적으로 발생됩니다 pipe

+0

그것은 기존의 파일을보고해야 그 블록을 입력 있지 않다면, 당신의 편집에 관하여. 상대 경로가 정확하고, 프로젝트/작업 디렉토리 주위에 다른'schedule.json'을 가져 오지 않았습니까? –

+0

@JamesThorpe 나는 바보 같았습니다. js 파일이 별도의 폴더에 있더라도 exress가 루트 디렉토리를 사용하는 것처럼 보입니다. 그래서 조부모 디렉토리에 파일을 저장했습니다. 왜 헤비 기어를 타고 달리는 것이 왜 효과가 있었는지 아직 확신 할 수 없습니까? –

답변

2

- 그것은 놀라운 vscode 내부 그것을 작품이 아마도 당신이 작업을 완료하거나하는 pipe 시간 수를 단계별로있어하지 않는 한 아마도 당신은 이전에서 파일을보고 있어요 다시 시작 사용할 때 운영.

대신, 당신은 무엇을하고 있는지하고 wait for it to finish해야합니다

var writer = fs.createWriteStream('../schedule.json'); 
fs.createReadStream('../template.json').pipe(writer); 
writer.on('finish', function() { 
    //It's safe to read the file here 
}); 

그러나,이 함수는 완전히 동 기적으로 일을하고 결과를 반환 할 것으로 예상되기 때문에, 당신을 위해 작동하지 않을 것. 콜백이나 약속을 사용하여 전환하면 (위의 내용에 따라 많은 작업이 필요하거나 필요하지 않을 수도 있음) 위의 작업을 수행 할 수 있습니다. 또는 비슷한 기능을 사용할 수도 있습니다. 이미 pipe 대신 사용하고 '

function init() { 
    var templ = null; 
    if (!fs.existsSync("../schedule.json")) { 
     templ = fs.readFileSync("../template.json", "utf8"); 
     fs.writeFileSync("../schedule.json", templ, "utf8"); 
    } 

    var content = templ != null ? 
        templ : 
        fs.readFileSync("../schedule.json", "utf8"); 

    return JSON.parse(content); 
} 
+0

다른 문제를 고칠 수 있지만 (대단히 감사합니다.), 작성한 동기 함수를 사용할 때 이전과 같은 오류가 발생합니다. –

+0

'내용'에있는 내용을 다시 확인 했습니까? 아마도'template.json'과 생성 된'schedule.json'의 내용을 검사 할 수도 있습니다 –