2017-08-05 3 views
0

Ich bekomme die Kann Header nicht festlegen, nachdem sie gesendet werden Fehler jedes Mal, wenn ich eine PUT-Anfrage auf der angegebenen Route versuchen. Und ich konnte nicht herausfinden, was das Problem hier ist. Ich erhalte auch eine Antwort von 200, aber die Daten werden nicht in der Datenbank aktualisiert.Kann Header nicht festlegen, nachdem sie gesendet werden Fehler bei PUT-Anforderung

Hier ist mein Code:

episodeRouter.route('/:episodeId/comments/:commentId') 
.get(Verify.verifyOrdinaryUser, function (req, res, next) { 
    Episode.findById(req.params.episodeId) 
     .populate('comments.postedBy') 
     .exec(function (err, episode) { 
      if (err) next(err); 
      res.json(episode.comments.id(req.params.commentId)); 
     }); 
}) 

.put(Verify.verifyOrdinaryUser, function (req, res, next) { 
    // We delete the existing commment and insert the updated 
    // comment as a new comment 
    Episode.findById(req.params.episodeId, function (err, episode) { 
     if (err) next(err); 
     episode.comments.id(req.params.commentId).remove(); 

     req.body.postedBy = req.decoded._id; 

     episode.comments.push(req.body); 
     episode.save(function (err, episode) { 
      if (err) next(err); 
      res.json(episode); 
     }); 
    }); 
}) 

.delete(Verify.verifyOrdinaryUser, function(req, res, next){ 
    Episode.findById(req.params.episodeId, function (err, episode) { 
     if (err) next(err); 
     episode.comments.id(req.params.commentId).remove(); 
     episode.save(function(err, resp) { 
      if (err) next(err); 
      res.json(resp); 
     }); 
    }); 
}); 

Dies ist der Fehler, den ich bekommen:

Error: Can't set headers after they are sent. 
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) 
at ServerResponse.header (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:719:10) 
at ServerResponse.send (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:164:12) 
at done (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:956:10) 
at Object.exports.renderFile (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\jade\lib\index.js:374:12) 
at View.exports.__express [as engine] (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\jade\lib\index.js:417:11) 
at View.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\view.js:126:8) 
at tryRender (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\application.js:639:10) 
at EventEmitter.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\application.js:591:3) 
at ServerResponse.render (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\response.js:960:7) 
at H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\app.js:91:7 
at Layer.handle_error (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\layer.js:71:5) 
at trim_prefix (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:310:13) 
at H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:280:7 
at Function.process_params (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:330:12) 
at next (H:\COURSERA\FULL STACK WEB DEVELOPMENT COURSE\CAPSTONE PROJECT\Capstone Project\watchours\node_modules\express\lib\router\index.js:271:10) 

Antwort

1

Ihr Code ein paar Fehler/Probleme hat:

  1. Sie nicht beendet die Funktion, wenn ein Fehler ausgelöst wurde. Aus diesem Grund sendet Ihr Code die Antwort zweimal: erstens mit Fehler, zweitens mit den Daten.
  2. Sie verwenden keine Versprechen. Es ist kein Bug, aber jetzt ist es 2017 und ES7 ist bereits veröffentlicht, Sie sollten Callbacks vermeiden.

Die feste, verbesserte Code konnte sieht so:

.put(Verify.verifyOrdinaryUser, (req, res, next) => { 
    Episode 
     .findById(req.params.episodeId, (err, episode) => { 
     req.body.postedBy = req.decoded._id; 

     episode.comments.id(req.params.commentId).remove(); 
     episode.comments.push(req.body); 
     return episode.save(); 
    }) 
    .then(episode => res.send(episode)) 
    .catch(next); 
}) 
+0

thanks man! Sie haben mir wertvolle Zeit gespart –

+0

@alexmac Es mag 2017 sein, aber Sie sollten nicht davon ausgehen, dass OP die neueste Version von Javascript verwendet. Es braucht Mühe, um den Wechsel zu machen. –

+0

@DavidKnipe Hmm, wer spricht über die neueste Version? node.js unterstützt nativ seit v4.0.0 (wurde vor zwei Jahren veröffentlicht) und seit 10.10 oder früher mit "bluebird" oder "Q". Also meine Antwort nicht über neue Features, es geht darum, die besten Ansätze zu verwenden und Fehler zu vermeiden, wenn man neuen Code schreibt. – alexmac

Verwandte Themen