2017-10-03 6 views
0

이 코드는 정상적으로 작동하는 것 같지만 마지막 줄의 파일 (someFile.json)을 읽으려고하면 간단히 작동하지 않습니다. 내가 알고 있지만 몇 가지 단서하십시오 :-(. 문제가 복잡합니다. 당신은 그것을 기록되기 전에 파일을 읽으려는node.js의 일부 문제 fs.createWriteStream

var fs = require('fs'); 

var request = require("request") 


var dataFile = 'data/someFile.json' 
var url = "https://api.someUrl" 
var file = fs.createWriteStream(dataFile); 
request(url).pipe(file); 

file.on('finish',function(){ 
    console.log('file download to ',dataFile) 
    file.destroy(); 
    //file.closeSync; 
    file.on('close', function(){ console.log('File Closed ')}) 
}) 


var datos = fs.readFileSync(dataFile, 'utf8'); 
+0

노드 비동기 ** 인 파일을 읽을 수 있습니다. 마지막 줄은 파일 쓰기가 완료되기 전에 실행됩니다. 'file.on'의 콜백 안에 넣으면 작동 할 것입니다. –

답변

0

. 당신이 작성하는 writeStream 비동기입니다. 즉,이 불확정 완료 의미 미래의 시간. 한편, 코드의 나머지 부분은 계속 실행하고 파일이 완료되기 전에 따라서 당신이 그것을 읽어보십시오. 당신이 가지고있는 코드에서

, 여기에 일련의 이벤트입니다.

  1. writeStream 만들기
  2. http 시작 request()
  3. 미래의 데이터는 request()에서 .pipe()으로 사용자 스트림으로 전달됩니다.
  4. finish 스트림의 이벤트 처리기를 등록하십시오.
  5. 에서 데이터를 가져오고 request()에서 데이터가 도착하고 버퍼링 될 수있는 쓰기 스트림으로 전송됩니다.
  6. 더 많은 데이터가 request()에서 도착하고 버퍼링 될 수있는 쓰기 스트림으로 전송됩니다.
  7. 요청이 완료되면 writeStream에 데이터를 디스크로 플러시하고 자체를 종료하도록 요청합니다.
  8. finish 이벤트가 발생합니다.
  9. close 이벤트 처리기를 등록하십시오.
  10. close 이벤트가 발생합니다.

당신은 아마 당신이 원하는 것을 할 스트림 알림을 사용할 수 있지만 그냥 파일을 테스트하려면 쓰기 스트림에 가까운 이벤트에 대한 완료 핸들에 fs.readFileSync()을 넣을 수 있습니다.

const fs = require('fs'); 
const request = require("request") 

const dataFile = 'data/someFile.json' 
const url = "https://api.someUrl" 
const file = fs.createWriteStream(dataFile); 
request(url).pipe(file); 

file.on('finish',function(){ 
    console.log('file download to ',dataFile) 
}).on('close', function(){ 
    console.log('File Closed '); 
    // file is available for reading now 
    var datos = fs.readFileSync(dataFile, 'utf8');  
    console.log(datos); 
}); 

또한 스트림을 .destroy() 개 필요하지 않습니다. 기본적으로 autoClose으로 설정되며 파이프에 연결된 스트림이 완료되면 자동으로 닫힙니다. 그리고 finish 오류 처리기 내에 .on('close', ...) 이벤트 처리기가 필요하지 않습니다.

  1. 이 writeStream는
  2. .pipe()하여 스트림에 request()에서 도착하는 HTTP request()
  3. 후크 미래의 데이터를 초기화 만들기 :이 새로운 제안 코드에서

    , 여기에 일련의 이벤트입니다.

  4. finish 스트림의 이벤트 처리기를 등록하십시오.
  5. 레지스터 close 이벤트 처리기.
  6. 데이터는 request()에서 도착하여 버퍼링 될 수있는 쓰기 스트림으로 전송됩니다.
  7. 더 많은 데이터가 request()에서 도착하고 버퍼링 될 수있는 쓰기 스트림으로 전송됩니다.
  8. 요청이 완료되면 writeStream에 데이터를 디스크로 플러시하고 자체를 종료하도록 요청합니다.
  9. finish 이벤트가 발생합니다.
  10. close 이벤트가 발생합니다.
  11. 전화 fs.readFileSync()는 **
+0

굉장!. 당신의 시간과 좋은 조언 jfriend00과 Sumner Evans에 대해서도 대단히 감사합니다. 고마워. 이제 node.js에 대해 조금 더 알고 있습니다 – Hender

+0

요청에 '끝'이벤트가없고 '끝'이라고만 말해야합니다 – Hender

+0

@Hender - Corrected. 고마워. – jfriend00