2014-10-10 3 views
0

NodeJS Server에서 주기적으로 다른 WebServer에서 사진을 가져 와서 특정 폴더에 저장합니다.NodeJS - EMFILE 예외 - writeStream에 파이프로 연결 요청

임 (타이머가 10 초마다 폴링 기능)에이 명령을 이렇게 :

request(cameraRequestOptions).pipe(fs.createWriteStream("./campics/cam" + cameraId + "pic" + latestCameraPictureNumber + ".jpg")); 

대상 이미지 파일의 이름은 "latestCameraPictureNumber"로 인해 변화된다.

EMFILE Exception에 문제가있는 경우 이상한 것은 서버가 실행되는 일부 Maschines에서만 발생하며 오랜 시간이 지나야 만 발생하는 것입니다.

내가 이미 알아 냈기 때문에, 이것은 너무 많은 FileStreams 또는 소켓을 여는 것을 의미 할 수 있습니다. 그래서 내 파이프에 뭔가 잘못된 일을하는 경우 확실하지 : WriteStream 또는 요청을 닫아야합니까? 그리고 언제?

문서는 말한다 :

readable.pipe (대상, [옵션]) #

대상 쓰기 가능한 스트림 데이터를 쓰는 대상

옵션은 파이프 옵션 객체

끝 Boolean 판독기가 끝날 때 작성기를 종료합니다. 기본값 = true

그래서 나는 그것이 자동으로 닫히 리라 생각했다.

도움 주셔서 감사합니다.

+0

요청 및 파일 스트림에 이벤트 처리기를 추가하여 각각 끝나고 끝내는 지 확인 했습니까? 그들이 끝나거나 끝내고 있다면, 얼마나 걸리나요? – mscdex

답변

0

문제가 더 복잡해 보입니다. 모든 스트림과 요청이 제대로 닫혀 있는지 확인하기 위해 콜백 함수를 추가했습니다. 문제가 다른 파이프를 사용하여 발생하는 것 같습니다. 임 사용하여 다음 스트림 oerations :

var fsCTmp = fs.createWriteStream("./campics/" + newLogId + "cam"+camId+"pic" + picNum + ".jpg"); 
fsCTmp.on('finish', wscfTest); 
fs.createReadStream("./campics/cam"+camId+"pic" + picNum + ".jpg").pipe(fsCTmp).on('finish', rsfTest); 

var fsCP = fs.createWriteStream("./campics/cam" + cameraId + "pic" + latestCameraPictureNumber + ".jpg"); 
fsCP.on('finish', wsftest); 
request(cameraRequestOptions).pipe(fsCP).on('finish', rftest); 

var fsWTmp = fs.createWriteStream("./campics/" + activeAlarmPicturesToAddToLog[j].logId + "cam"+cameraId+"pic" + activeAlarmPicturesToAddToLog[j].picNum + ".jpg"); 
fsWTmp.on('finish', wscfTest); 
fs.createReadStream(picturePath).pipe(fsWTmp).on('finish', rsfTest); 

그리고 웹 클라이언트로 파일을 전송 메신저를 통해

res.sendfile(<path>); 

모든 콜백 함수에서 콘솔에 로그를 만드는 중이지만 지금까지는 내 자신의 PC에서만 테스트 할 수있었습니다. 예외적으로 파이프의 일부가 완료된 후 광산을 제외한 모든 매치 체인에서만 예외가 발생합니다 (약 10-100).