2017-03-29 1 views
0

노드를 올바르게 이해하면 수신기는 연결된 후에 발생하는 이벤트 만 수신합니다. missing.txt가 누락 된 파일이라고 가정합니다. 이 작품 :fs.createReadStream에서 발생한 오류를 수신 대기

'use strict'; 
const fs = require('fs'); 
var rs = fs.createReadStream('missing.txt'); 
rs.on('error', (err) => console.log('error ' + err)); 

그것은 생산하지 : 오류 오류 : ENOENT를 : 그런 파일이나 디렉토리를 열고 ... \ missing.txt

가 왜 작동합니까?

setTimeout(() => rs.on('error', (err) => console.log('error ' + err)) , 1); 

을하지만, 5ms의 시간 초과를 변경하고 오류가 처리되지 않은 이벤트로 발생합니다 : 또한 다음과 같이 네 번째 줄을 변경하면 작동합니다.

이벤트 리스너 추가 지연이 짧으면 방출 된 오류를 잡기 위해 경쟁을 설정합니까? 그렇다면 스트림으로 열기 전에 파일의 존재 여부를 명시 적으로 확인해야합니까? 그러나 그것은 fs.exists와 관련하여 Node docs state과 같은 다른 경주를 만들 수 있습니다. "다른 프로세스는 두 번의 호출 사이에서 파일의 상태를 변경할 수 있습니다." Moroeover, 이벤트 리스너는 다른 오류를 잡아 내기 때문에 편리합니다.

명백한 지연을 도입하지 않고 이벤트 리스너가 존재하지 않는 파일을 스트리밍하려는 시도에서 오류를들을만큼 충분히 빠르게 추가된다고 가정하는 것이 가장 좋습니다.

답변

0

적어도 때까지 방출/던져되지 않습니다 fs.createReadStream()에서 ReadStream 인스턴스를 받고 이후에 발생하는 모든 오류 다음 틱. 따라서 '오류'리스너를 동 기적으로 생성하는 한 항상 스트림에 첨부 할 수 있습니다. ReadStream이 생성자 끝에 this.open()을 호출하기 때문에 setTimeout 실험이 가끔 작동합니다. ReadStream.prototype.open() 메서드는 fs.open()을 호출하여 사용자가 제공 한 파일 경로에서 파일 설명자를 가져옵니다. 이것은 또한 비동기 함수이므로 setTimeout 안에 '오류'수신기를 연결하면 경쟁 조건이 생성된다는 것을 의미합니다.

먼저 오류가 발생하여 fs.open()이 콜백을 호출하거나 setTimeout()이 콜백을 호출하여 '오류'리스너를 첨부합니다. ReadStream 인스턴스를 생성 한 후에 '오류'리스너를 첨부해도 무방합니다. 동기식으로 수행해야하며 경쟁 조건에 문제가 없을 것입니다.

+0

좋은 답변입니다. 다음 틱의 의미를 이해하지 못하는 사람들을위한 [이벤트 루프] (http://stackoverflow.com/questions/21607692/understanding-the-event-loop)에 대한 자세한 내용은 다음과 같습니다. – Govdata1

1

This error occur when there no such location exists or creating permission are not with user program.

이 도움이 될 수 있습니다

var filename = __dirname+req.url; 

var readStream = fs.createReadStream(filename); 
    readStream.on('open', function() { 
    readStream.pipe(res); 
}); 

readStream.on('error', function(err) { 
    res.end(err); 
}); 

Why are you listening error on timeout ?

감사

+0

시간 초과시 오류를 수신하는 이유를 분명히하기 위해 원래의 질문을 편집했습니다. – Govdata1