2017-04-01 1 views
-1

Je sais que cela a déjà été demandé de plusieurs façons, mais mon problème semble être différent de ceux déjà affichés. J'essaie d'envoyer des données à partir d'un formulaire dans Google Firebase. J'ai une application de noeud en utilisant express.Node Express Impossible de définir les en-têtes après leur envoi

Voilà ma fonction qui envoie les données à firebase:

function validateForm() { 

async.series([ 
    function (callback) { 
     var errors = "<strong>The following errors were entered:\n"; 
     var name = $('#name').val(); 
     var story = $('#story').val(); 

     if (name.length < 1) { 
      errors += "\n-Please enter a valid name"; 
      callback("Please enter a valid name", null); 
     } 

     if (story.length < 1) { 
      errors += "\n-Please enter a valid story"; 
      callback("Please enter a valid story", null); 
     } 
     console.log("FInished validating"); 
     callback(null, "finished validating"); 
    }, function (callback) { 
     firebase.database().ref('stories/' + Date.now()).set({ 
      name: name, 
      story: story 
     }, function() { 
      console.log("Firebase callback"); 
      callback(null, "sent data!"); 
     }); 
    }, function (callback) { 
     console.log("Finished!"); 
     callback(null, "done") 
    } 
]) 
} 

(ajouté quelques console.logging pour plus de clarté pour assurer que j'avais les callbacks à droite)

La soumission est déclencheur en cliquant sur un div c'est des styles pour ressembler à un bouton, donc je sais qu'il n'y a pas de comportement par défaut des problèmes de formulaires qui causent le problème. Voici l'erreur que je reçois dans le nœud.

Error: /Users/keegan/WebstormProjects/hack4health/views/error.hbs: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10) at ServerResponse.send (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12) at res.render.done (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:956:10) at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:93:9 at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20) at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:88:18 at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:69:11 at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20) at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:64:20

+0

Le JS I fourni est côté client – thekeegs

+0

et 100% defo aucun code n'est déclenché ailleurs dans votre application? J'en ai déjà eu d'autres similaires ... mais ça a toujours été quelque chose de minuscule ailleurs. – John

Répondre

0

Il s'avère que cela a été causé par la récupération des données sur la modification depuis Firebase, au lieu de simplement récupérer les données une fois en charge.

2

Vous appelez les callback jusqu'à trois fois:

if (name.length < 1) { 
    … 
    callback("Please enter a valid name", null); 
} 
if (story.length < 1) { 
    … 
    callback("Please enter a valid story", null); 
} 
… 
callback(null, "finished validating"); 

Cela conduira à la fonction de rappel qui écrit la réponse à appeler plusieurs fois, à défaut quand il tente d'écrire les en-têtes à nouveau après avoir envoyé le premier corps.

Vous voulez soit return après avoir appelé le callback, ou vous voulez l'appeler une seule fois à la fin avec le errors accumulé.