2013-02-14 2 views
0

저는 Node.js를 처음 사용합니다. 저는 iPhone 백엔드 서버 백엔드로 사용하고 있습니다. 나는 JSON으로 POST를 호출 해요 : {FIRSTNAME : "밥", 이메일 : [email protected]}이 (Express와 몽구스를 사용하여)처럼Node.js 백엔드에서 iPhone 프론트 엔드로 JSON 오류를 보내는 중 : "오류 : 전송 후 헤더를 설정할 수 없습니다."

는 Node.js를 코드는 같습니다

var User = new Schema({ 
    firstname : { type: String, required: true} 
    , email  : { type: String, required: true, unique : true} 

}); 
var User = mongoose.model('User', User); 

그리고 게시물에 대한

app.post('/new/user', function(req, res){ 

    // make a variable for the userData 
    var userData = { 
     firstname: req.body.firstname, 
     email: req.body.email 
    }; 

    var user = new User(userData); 

    //try to save the user data 
    user.save(function(err) { 
     if (err) { 
      // if an error occurs, show it in console and send it back to the iPhone 
      console.log(err); 
      res.json(err); 
     } 
     else{ 
      console.log('New user created'); 
     } 
    }); 

    res.end(); 
}); 

는 지금, 나는 동일한 이메일과 중복 사용자를 만들려고 해요. 전자 메일에있는 "고유 한"제약으로 인해이 오류가 발생할 것으로 예상됩니다.

그러나 node.js 프로세스는 "오류 : 보낸 후 헤더를 설정할 수 없습니다."라는 메시지와 함께 종료됩니다.

iPhone 클라이언트에 이와 같은 시나리오로 메시지를 보내고 싶습니다. 예를 들어, 위의 경우, 새로운 사용자 생성 결과 (성공 또는 실패)를 말하는 JSON을 iphone으로 되돌려 보내고 싶습니다.

감사합니다.

+0

:

res.json(420, err); 

그런 식으로, 당신은 단지 JQuery와 함께 같은 것을 제공합니다, 당신의 HTTP 가져 오기에서 메시지를 구문 분석해야합니다. 그래서 아마도 res.send와 res.json이 스스로 res.end를 호출할까요? – kurisukun

+0

나는 생각하지 않는다. 코드에서 비동기 적으로 실행되기 때문에'res.end'보다는'res.end'가 먼저 호출됩니다. – balazs

답변

3

코드의 비동기 특성 때문입니다. res.end()user.save의 콜백 함수 전에 실행되고 그 콜백 내에 res.end()을 넣어야합니다 (마지막에).

이 방법 :

user.save(function(err) { 
    if (err) { 
     // if an error occurs, show it in console and send it back to the iPhone 
     console.log(err); 
     return res.json(err); 
    } 
    console.log('New user created'); 
    res.end(); 
}); 
2

적절한 HTTP 상태를 사용하여 오류를 보내, 당신은 그렇게 할 4XX의 많음이있다. 이 문제를 해결 마지막 res.end을 주석

jQuery.ajax({ 
    ... 
    error: function (xhr, ajaxOptions, thrownError) { 
    if(xhr.status == 420) { 
     JSON.parse(xhr.responseText); 
    } 
    } 
관련 문제