2016-07-24 2 views
0

내 스크립트는 데이터베이스에 ID가 있는지 확인합니다. 그렇지 않으면 논리가 바로 그 다음에 멈춰 있어야합니다.문서가없는 경우 응답 중지

하지만 현재 "제공된 프로젝트 ID가 데이터베이스에 없습니다."를 반환하는 대신 "필요한 세부 정보를 모두 보내주십시오."가 표시됩니다. (아마 최초의 반환 함수의 우리를 필요하기 때문에) 내가 잘못 뭐하는 거지

var projectExists = function(pId, callback) { 
    ProjectsData.count({project_id: pId}, function(err, doc) { 

     if (err) { 
      throw err; 
     } 
     callback(doc); 
    }); 
}; 

// Create a new Game ID. 
v1.post("/", function(req, res, next) { 

    if (!("project_id" in req.body)) { 
     return res.send("You need to provide Project ID"); 
    } 

    // Check if the Project ID is in the file. 
    // Problematic bit 
    projectExists(req.body.project_id, function(c) { 
     if (c == 0) { 
      return res.send("The provided Project Id does not exist in our database."); 
     } 
    }); 

    var gameDataObj = req.body; 

    GameData.addGameId(gameDataObj, function (err, doc) { 
     if (err) { 
      if (err.name == "ValidationError") { 
       return res.send("Please send all the required details."); 
      } 
      throw err; 
     }; 

     res.json(doc); 
    }) 
}); 

? 이 작업을 수행하는 더 좋은 방법이 있습니까?


그리고 추가 질문; 우리가이 개 응답을 전송하지만 이상한 것은 res.headersSent을 확인하는 마지막 순간 false를 반환 할 때까지한다는 것입니다 때문에

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
    at ServerResponse.header (G:\node\vnlytics\node_modules\express\lib\response.js:719:10) 
    at ServerResponse.send (G:\node\vnlytics\node_modules\express\lib\response.js:164:12) 
    at G:\node\vnlytics\controllers\v1\game.data.js:35:17 
    at G:\node\vnlytics\controllers\v1\game.data.js:20:9 
    at Query.<anonymous> (G:\node\vnlytics\node_modules\mongoose\lib\model.js:3331:16) 
    at G:\node\vnlytics\node_modules\kareem\index.js:259:21 
    at G:\node\vnlytics\node_modules\kareem\index.js:127:16 
    at nextTickCallbackWith0Args (node.js:420:9) 
    at process._tickCallback (node.js:349:13) 

그것은 아마 : ID가 잘못되면 현재의 반복에서,이 오류가 있습니다.

+1

비동기 작업을 순서대로 지정해야합니다. 첫 번째 비동기 작업이 끝나기를 기다리지 않고 다음 비동기 작업으로 넘어갑니다. 따라서 모두 병렬로 실행되고 모두 완료되면 여러 응답을 보내려고합니다 (따라서 오류가 발생합니다). – jfriend00

+0

오케이. 나는 그것을 보았고 Promise를 사용하여 그렇게 할 수있는 것처럼 보인다. – DragoonHP

+0

일반적으로 오류가 올바르게 처리되지 않았 음을 의미합니다. err을 던지지 않고 next (err)를 사용하고 오류 처리기에서 도대체 무슨 일이 일어나고 있는지 확인하려고 했습니까? –

답변

1

제 의견에 말했듯이 비동기 작업을 적절하게 순서대로 처리해야 이전 작업의 결과를 알고 처리 할 때까지 다음 작업을 시작하지 않아도됩니다. 다음과 같이 할 수 있습니다.

// Create a new Game ID. 
v1.post("/", function(req, res, next) { 

    if (!("project_id" in req.body)) { 
     return res.send("You need to provide Project ID"); 
    } 

    // Check if the Project ID is in the file. 
    // Problematic bit 
    projectExists(req.body.project_id, function(c) { 
     if (c == 0) { 
      return res.send("The provided Project Id does not exist in our database."); 
     } else { 
      var gameDataObj = req.body; 

      GameData.addGameId(gameDataObj, function (err, doc) { 
       if (err) { 
        if (err.name == "ValidationError") { 
         return res.send("Please send all the required details."); 
        } 
        throw err; 
       }; 

       res.json(doc); 
      }) 
     } 
    }); 

}); 

P.S. throw err을 적절한 오류 처리로 대체해야합니다. 실제로 여기에 오류 응답을 보내야합니다. throw은 응답을 보내지 않은 경우 처리를 중지하는 것 외에는 아무 것도하지 않습니다.

+0

고맙습니다. 나는 내가해야만하는 것이 else 블록을 추가하는 것이라고 믿을 수 없다. v_v 적어도 몽구스가 약속을 지킨다는 것을 나는 잘 알고있다. 당신의 도움을 주셔서 대단히 감사합니다. – DragoonHP

+0

@DragoonHP - 기록을 위해 약속을 지키면 더 좋을 것입니다. 직렬화 연산을위한 코드를보다 깨끗하게 만들 수 있으며 일반적으로 오류 처리가 훨씬 쉽습니다. – jfriend00

관련 문제