2016-09-08 2 views
0
여기

는 코드입니다이 코드가 '오류'이벤트에서 오류를 catch하지 않는 이유는 무엇입니까?

문제 다음 "fileName에"서버가 충돌 지정
'use strict'; 

let fs = require('fs'); 

module.exports = (fileName, res) => { 
    fs.createReadStream(fileName) 
     .pipe(res) 
     .on('error', err => { 
      console.log('==========>> ERROR : ' + err.message); 
      res.statusCode = 500; 
      res.end('Internal Server Error: 500'); 
     }) 
     .on('end', res.end); 
}; 

"ENOENT : 그런 파일이나 디렉토리"메시지.

왜이 코드가 .on ('error', ...) 블록의 오류를 catch하지 않습니까?

감사합니다.

+1

오류의 해당 지점에 도달하지 못했기 때문에 원래 문제는 fileName과 같습니다. 코드의 해당 부분에서 충돌이 발생합니다. 즉, ERROR :가 호출되지 않습니다. – Roberrrt

답변

1

언뜻보기에는 내가 읽는 스트림에 실제로 연결하지 않았다고 생각합니다.

The readable.pipe() method returns a reference to the destination stream making it possible to set up chains of piped streams

가 대상 스트림을 통해 오류가 아니므로 오류 콜백이 호출되지 않습니다 :

Stream.pipe() 설명서를 참조하십시오.

시도 :

module.exports = (fileName, res) => { 
    fs.createReadStream(fileName) 
     .on('error', err => { 
      console.log('==========>> ERROR : ' + err.message); 
      res.statusCode = 500; 
      res.end('Internal Server Error: 500'); 
     }) 
     .on('end', res.end) 
     .pipe(res); 
}; 

... 또는 (명확하고 더 undestandable) :

module.exports = (fileName, res) => { 
    var iStream = fs.createReadStream(fileName); 
    iStream.on('error', err => { 
     console.log('==========>> ERROR : ' + err.message); 
     res.statusCode = 500; 
     res.end('Internal Server Error: 500'); 
    }); 
    iStream.on('end', res.end); 
    var oStream = iStream.pipe(res) // returns refernce to the output stream (actually res); 
}; 

이 ... 반면에, 나는 확실하지 않다 스트림이 실제로 생성 될 경우 파일이 존재하지 않는 경우. 아마 fs.createReadStream() 자체

실제로 그렇게 스트림을 생성 전에 오류 를 던질 것이다, 이런 이유로, 당신은 아마 그것은 try {...} catch(){...} 블록에 묶어야한다.

어쨌든 나는 그것에 대해 확실하지 않습니다. createReadStream()이 파일을 열기 전에 스트림을 만든 다음 파일이 실제로 존재하지 않는 경우 (스트림을 통해) 오류가 발생하면 (코딩 관점에서) 더 편리 할 것입니다. 그러나 이것은 이전에 조사되거나 테스트되어야합니다.

+1

정말 고마워요! –

관련 문제