2014-01-28 49 views
2

在檢查用戶是否已投票時得到此錯誤。我建議setheader的事情是有責任的。setheader給出錯誤:「拋出新的錯誤('發送後無法設置標題');」

CODE

index : function(req, res, next){ 
    if(req.method == "POST"){ 
     var aa = Users.findOneByEmail(req.param('email'), function(err, data, next){ 
      if(err) res.serverError(err); 
      console.log(data); 
      if(data){ 
       res.redirect('/users'); 
       return; 
      } 
     }); 

     var data = { 
      remoteip: req.ip, 
      challenge: req.body.recaptcha_challenge_field, 
      response: req.body.recaptcha_response_field 
     }; 

     // console.log(data); 
     var recaptcha = new Recaptcha(PUBLIC_KEY, PRIVATE_KEY, data); 
     recaptcha.verify(function(success, error_code) { 
      if(!success){ 
       return res.serverError(error_code)    
      } else { 
       var username = req.param('username'); 
       var vote = req.param('vote'); 
       var email = req.param('email'); 
       var reason = req.param('reason'); 
       console.log('I am here 2'); 
       Users.create({ 
        username: req.param('username'), 
        email: email, 
        candidate_id : vote, 
        reason : reason 
       }).done(function(err, data){ 
        if(err){ 
         return res.serverError(JSON.stringify(err)); 
        } else { 
         return res.send('You sucessfully voted'); 
        } 
       }); 
      } 

      res.redirect('/candidates/'); 
     });   
    } else { 
     var recaptcha = new Recaptcha(PUBLIC_KEY, PRIVATE_KEY); 
     Candidates.find().done(function(err, data){ 
      res.view({candidates : data, recaptcha_form: recaptcha.toHTML()}); 
     }); 
    } 
}, 

錯誤:

http.js:691  
    throw new Error('Can\'t set headers after they are sent.'); 
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) 
    at ServerResponse.res.setHeader (/usr/local/lib/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:59:22) 
    at ServerResponse.res.set.res.header (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:522:10) 
    at ServerResponse.res.location (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:656:8) 
    at ServerResponse.res.redirect (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:698:8) 
    at /Users/korotane/Documents/node_projects/the_next_indian_pm/api/controllers/UsersController.js:75:14 
    at IncomingMessage.<anonymous> (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/recaptcha/lib/recaptcha.js:160:20) 
    at IncomingMessage.EventEmitter.emit (events.js:117:20) 
    at _stream_readable.js:920:16 
    at process._tickDomainCallback (node.js:459:13) 
+0

[Node.js錯誤:發送後無法設置標頭]的可能重複(http://stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they -are-發送) –

回答

3

看看行#4:

if(err) res.serverError(err); 

的事情是,res.serverError發送頭已經,所以si如果您沒有中斷執行,則以下任何調用都會導致錯誤:res.serverError, res.send, res.redirect

在你的特殊情況下,它是重定向。在回溯的相應行:

... 
at ServerResponse.res.redirect (/Users/korotane/Documents/node_projects/the_next_indian_pm/node_modules/sails/node_modules/express/lib/response.js:698:8) 
... 

長話短說,快速修復將增加return到第四行:

if (err) return res.serverError(err); 

儘管如此,也不能保證一切將無縫工作。

0

在複雜的代碼中,無論何時您想在很多場合發送響應 您都可以將res.headersSent設置爲false。

IE:如果(res.headersSent){res.send()}

如果之前詭計發送響應所用的 「返回」,則代碼將不進一步執行。

相關問題