2014-04-11 2 views
0

차단 또는 차단 안 함, 이제 질문 :차단 또는 차단 안 함 (Express.js)

서버가 임시 이미지를 저장하는 폴더 인 간단한 경로 노출입니다. 이 메서드는 이미지를 반환하고 그 것이다.

app.get('/uploads/fullsize/:file',function (req, res){ 
      var file = req.params.file; 
      console.log("Crap comign from passport file: " + file) 
      var img = fs.readFileSync(myPath + "/uploads/fullsize/" + file); 
      res.writeHead(200, {'Content-Type': 'image/jpg' }); 
      res.end(img, 'binary'); 
     }); 

나는 다음 행 걱정 : 표시

var img = fs.readFileSync(myPath + "/uploads/fullsize/" + file); 

동기화 호출 할 수 있습니다. 내가 비동기로 바꿀까요?

fs.readFile(req.files.file.path, function (err, imageBinaryData) { 

    //read code here 
}); 

이것은 유효한 우려입니까, 아니면 과도한 반응입니까? 내가 1000 명의 동시 사용자가 같은 일을하는 경우 차단을할까요?

답변

1

예, 비동기 호출로 변경해야합니다. 이 호출을 위해 Q library과 다른 비동기 호출을 사용하는 것이 좋습니다.

예 (직선 Q 워드 프로세서에서) :

readFile("foo.txt", "utf-8") 
    .then(function(data) { 
    //other processing 
} 

을 아니면 예에 적응 :

var readFile = Q.denodeify(FS.readFile); 

다음과 같은 사용

app.get('/uploads/fullsize/:file',function (req, res){ 
      var readFile = Q.denodeify(FS.readFile); 
      var file = req.params.file; 
      console.log("Crap comign from passport file: " + file) 
      readFile(myPath + "/uploads/fullsize/" + file) 
       .then(function(img) { 
        res.writeHead(200, {'Content-Type': 'image/jpg' }); 
        res.end(img, 'binary'); 
       }) 
       .fail(function(err) { 
        res.send(500, {message:err}); 
       } 
     }); 
+2

약속을. 이 응용 프로그램에는 너무 많은 CB가 흩어져 있습니다. 그러나 결국, 약속을 위해 응용 프로그램을 "업그레이드"해야 할 것입니다. –

+0

가장 이해가되는 부분에 약속을 추가 할 수 있습니다. 일반적으로 콜백 지옥을 나타내는 "오른쪽으로 이동"코드가 표시되면이를 기반으로 약속을해야합니다. 또한 Q (이 예에서 보았 듯이)는 노드 스타일 콜백 코드를 약속 된 코드로 전환 할 수있게 해줍니다. 또한 Q github 페이지의 예제는 코드 콜백을 작성하고 친숙하다고 약속하는 방법을 보여줍니다. 익숙해지기 위해 약간 놀아 두는 것이 좋습니다. 그런 다음 "then"ify에 대해 이해할 수 있습니다 당신의 코드. – binarygiant

+0

여기에 한 가지 추가 생각 ... 일반적으로 비동기 코드가 더 동기식으로 보이게하여 코드가보다 읽기 쉽게 만들어 지도록 약속하면 여러 비동기 호출을 기다려야하는 인스턴스와 같이 더 까다로운 문제도 해결할 수 있습니다. 완료하기 전에 완료하고 응답을 보냅니다. Q (다른 약속 라이브러리)는이를 성취하는데 크게 도움이 될 수 있습니다. – binarygiant

2

예 - 우리는해야한다 우리가 할 수있는 것 비동기.

"readFile"은 괜찮습니다!

는 또한 경로가 "fullsize"라고 그래서 당신이 파일을 스트리밍에 대해 생각해야합니다 는하지만 가장 중요한 부분이 될하지 않을 수 있습니다. 당신은 약 1000 명의 동시 사용자를 말했고 이미지의 크기에 따라 달라집니다.

비동기 readFile은 전체 파일을 메모리로로드합니다. 그리고 1000 명의 사용자가있는 경우 각각 8MB 이상을 동시에로드 할 수 있습니다. 서버 메모리가 "가득 찰"수 있습니다. 대한

"스트리밍"난이 비디오를 추천 할 수 있습니다 : 콜백 대 Node.js - streaming 25GB text file

+0

좋은 지적 세바스챤. 스트리밍 옵션을 확실히 살펴 보겠습니다. –

관련 문제