2017-10-16 5 views
0

J'utilise Node.js et ExpressJS pour enregistrer un modèle mangouste. Je reçois l'erreur de Error: Can't set headers after they are sent. Je pense qu'il a à voir avec la ligne res.redirect("/dashboard/it/model"); en conflit avec setRedirect({auth: '/login'}), de mon itinéraire, le code dans le setRedirect est ci-dessous étiqueté. Le setRedirect provient d'un middleware appelé middleware-responder qui faisait partie du modèle que j'utilise pour créer des comptes utilisateur Stripe. Je ne peux pas l'enlever autant que je sache. mon GitHub repo j'ai commis tous les fichiers qui ne sont pas fichiers test et sont pertinents (pas de vue non nécessaires ect que ce qui est déjà là)Erreur: Impossible de définir les en-têtes après leur envoi Node.js et ExpressJS

Enregistrer Modèle

if(type=="aps"){ 
     var newAccessPoint = { 
      name: name, 
      manufacturer: manufacturer, 
      model: model, 
      range: range, 
      bands: bands, 
      channel: channel, 
      poe: poe, 
      notes: notes, 
      signout: signout, 
      author:author 
     }; 
     // Create a new access point and save to DB 
     AP.create(newAccessPoint, function(err, newlyCreated){ 
      if(err){ 
       console.log(err); 
      } else { 
       //redirect back to models page 
       res.redirect("/dashboard/it/model"); 
      } 
     }); 
    } 

Route

app.post('/dashboard/it/model/new', 
    setRender('dashboard/it/modelCreate'), 
    setRedirect({auth: '/login'}), 
    isAuthenticated, 
    dashboard.getDefault, 
    (req, res) => { 

Code setRedirect

exports.setRedirect = function(options){ 
    return function(req, res, next){ 
    if(req.redirect){ 
    req.redirect = _.merge(req.redirect, options); 
    } else { 
    req.redirect = options; 
    } 
    next(); 
}; 
}; 

setRender code

exports.setRender = function(view){ 
    return function(req, res, next){ 
    req.render = view; 

    next(); 
    }; 
}; 

Répondre

0

Cela se produit parce que vous essayez d'envoyer une réponse au client lorsque vous avez déjà fermé la connexion.

Difficile à dire par la façon dont vous nous montrez votre code, mais il semble que vous redirigez des options, puis dans la même demande vous redirigez au tableau de bord/il/modèle

+0

Pas de redirection vers l'option, ce que vous voyez est les options sont la valeur dans 'setRedirect ({auth: '/ login'}),' donc la redirection est 'login' mais seulement si l'utilisateur n'est pas J'ai essayé de commenter cette ligne et j'ai eu une nouvelle erreur. 'Path doit être une chaîne. Reçu undefined' –

+0

Si l'utilisateur est déjà connecté alors vous appelez next() et passez au middleware suivant, puis à la fin de la requête, lorsque vous avez terminé ce que vous deviez faire, vous faites la redirection. Vous avez seulement besoin de rediriger quand il n'y a pas d'utilisateur connecté, pas besoin de rediriger s'il y a un utilisateur, vous continuez simplement avec la demande –

+0

Okay donc commenter cette ligne me donne l'erreur 'Path doit être une chaîne. Reçu undefined' erreur si différente que dans OP. Comment puis-je déboguer/résoudre cette erreur alors. –

0

Je tire votre code de github . Je pense que le message d'erreur était clair. Dans votre middleware getDefault(), vous affichez une réponse afin que le serveur commence à envoyer des données à votre client et juste après que vous essayez de le rediriger vers une autre URL. C'est pourquoi quand votre commentaire sur ce middleware tout fonctionne bien.

+0

Je l'ai eu pour disparaître en supprimant le deuxième rendu. Il sauve encore et tout est bon. Je n'ai pas encore posté de réponse parce que j'espérais que quelqu'un me dirait une solution qui corrigerait certaines de mes autres erreurs qui sont liées. –