2016-10-18 2 views
0

익스프레스 및 노드를 처음 사용하고 고급 REST 클라이언트를 사용하여 앱에서 보호 된 REST 엔드 포인트를 테스트 할 때 데이터가 엔드 포인트에서 리턴됩니다. 그러나 예상대로 클라이언트에 콘솔 로그는노드가있는 익스프레스 앱에서 "오류 : 헤더를 설정할 수 없습니다"노드

"Error: Can't set headers after they are sent" 

서버를 중지합니다. 여기에 SO에 대한 검색이 하나 개 이상의 응답을 보낼 때 발생하는 것 같습니다하지만 난 내 코드에서 해당 표시되지 않습니다 :

router.get('/books', userAuthenticated, function (req, res, next) { 
    Book.find({}, function(err, docs){ 
     if(err) { 
      res.send(err) 
     } else { 
      res.send(docs); 
      // next(); 
      // return; 
     } 
    }) 
}); 

오전 클라이언트로/요청/응답을 보내거나 때 예상이 오류가 서버에서 오류를 처리 할 때 뭔가 빠졌습니까?

+0

가장 좋은 추측은 userAuthenticated 미들웨어가 응답을 보내는 것입니다. 그 함수를 확인하고, 다음에 호출하기 전에 res가 보내지지 않았는지 확인하십시오. – Brian

+0

다음과 같이 간단하게 할 수는 있지만 여전히 같은 오류로 리팩터링 한 userAuthenticated 미들웨어가 있습니다. function userAuthenticated (req, res, next) { if (req. isAuthenticated()) { 다음 반환(); } res.redirect ('/ notloggedin'); } – user2232681

+0

브라우저 또는 우편 배달부에서 응답을 확인하십시오. dev 콘솔을 열고 네트워킹으로 이동 한 다음/books – Brian

답변

0

Express는 여러 계층의 코드가 요청을 처리 할 수있는 "미들웨어"라는 개념을 특징으로하는 node.js 서버입니다.

그런 경우 함수가 응답을 두 번 돌려 보내지 않는지 확인할 필요가있을뿐만 아니라 다른 미들웨어가 응답을 다시 보내지 않는지 확인해야합니다.

이 코드는이 함수 이전에 "userAuthenticated"라는 미들웨어가 호출되었음을 나타냅니다. 해당 미들웨어가 이미 응답을 보내고 있는지 확인해야합니다.

+0

다음은 userAuthenticated (req, res, next) {if (req.isAuthenticated()) {return next();와 같이 간단하게 할 수있는 것처럼 리팩터링 한 userAuthenticated 미들웨어입니다. } res.redirect ('/ notloggedin'); } – user2232681

0
I don't think the problem was in the middleware. It looks like I was calling done() twice in passport deserialize. I commented out the first instance and the problem disappeared in all my routes. Although, I am not sure if I should comment out the first or second instance but I'll work on that next. 
passport.deserializeUser(function(obj, done) { 
    console.log(obj); 
    Account.findById(obj, function(err, user) { 
     console.log(user); 
     //done(err, user); 
    }); 
return done(null, obj); 
}); 
관련 문제