2016-10-12 3 views
2

사용자가 로그인 버튼을 클릭하면 서버는 "보낸 후 헤더를 설정할 수 없습니다."라는 오류를 표시하여 자체를 닫습니다. 어떤 도움이 필요합니까?노드 오류 : 헤더를 보낸 후 설정할 수 없습니다. 어떻게 해결할 수 있습니까?

Server.js는

$scope.signin = function(){ 
        $http.put('/users/signin',{username:$scope.username,password:$scope.password}) 
     .then(function(res){ 
       $cookies.put('token',res.data.token); 
       $scope.currentUser = $scope.username; 
       alert("Successfully signed in"); 
      },function(err){ 
       alert("bad login credentials"); 
      }); 
    }; 

답변

1

usersCollection.findOne가 비동기이고 그것의 콜백이 호출 된 같은 res.send(); 후라고합니다 내가 서버에 호출을하고있는 곳에서

app.put('/users/signin',function(req,res,next){ 
    db.collection('users',function(err,usersCollection){ 
     usersCollection.findOne({username:req.body.username},function(err,user){ 
      bcrypt.compare(req.body.password,user.password,function(err,result){ 
       if(result){ 
        var token = jwt.encode(user,JWT_SECRET); 
        return res.json({token:token}); 
       }else{ 
        res.status(400).send(); 
       } 
      }) 
     }); 
    }); 
    res.send(); 
}); 

컨트롤러를 .. 파일.

res.send();bcrypt.compare 콜백으로 이동하십시오.

app.put('/users/signin', function(req, res, next) { 
    db.collection('users', function(err, usersCollection) { 
     usersCollection.findOne({ username: req.body.username }, function(err, user) { 
      bcrypt.compare(req.body.password, user.password, function(err, result) { 
       if (result) { 
        var token = jwt.encode(user, JWT_SECRET); 
        res.json({ token: token }); 
       } else { 
        res.status(400); 
       } 

       // like here 
       res.send(); 
      }); 
     }); 
    }); 
}); 

콜백이란 무엇입니까? wikipedia에서

, 콜백는 다른 코드에 인수로 전달되는 실행 코드의 조각이다. 정의에 의해 콜백을 사용하면 비동기적인 것은 없지만 비동기 프로그래밍과 함께 사용하는 것은 정말 유용한 개념입니다.

JavaScript에서는 함수가 함수 참조를 콜백 역할을하는 인수로 취할 수 있습니다.

function someFunction(callback) { 
    console.log("before async callback"); 
    setTimeout(callback, 1); // calls the callback asynchronously 
    console.log("after async callback"); 
} 

그것은 함수 표현식을 사용하여 기존 기능

function myExistingFunction() { 
    console.log("inside a callback"); 
} 
someFunction(myExistingFunction); 

또는이 등을 사용하여, 다음과 같이 호출 할 수

someFunction(function(){ 
    console.log("inside a callback"); 
}); 

someFunction을 모두 호출하여에 다음을 인쇄 할 것이다 콘솔 그 순서대로 :

before async callback 
after async callback 
inside a callback 

왜 순서가 좋습니까?

someFunction이 비동기 함수 setTimeout에 콜백을 전달하므로 콜백이 즉시 호출되지 않고 호출 스택이 완료된 후에 만 ​​호출됩니다. 그래서 someFunction은 완전히 끝났고, 언젠가는 콜백이 호출됩니다.

)은 (내가 res.send을 제거 ...

+0

안녕하세요 .. 감사를 표현 그것의 작동하지만 지금은 내게 다른 오류 $ cookies.put을주는거야 ..... – ravi

+0

@ ravi 그 또 다른 문제는, 그래서 다른 질문을 부탁드립니다. –

+1

도움을 주셔서 감사합니다.이 문제를 해결했습니다. :) – ravi

관련 문제