2017-09-30 4 views
0

Bonjour J'ai tout essayé mais le code très simple suivant me donne l'erreur "Impossible de définir les en-têtes après leur envoi", je travaille sur ce sujet depuis Les jours où vous entrez est très apprécié.express - Erreur: Impossible de définir les en-têtes après leur envoi

app.post('/login', function (req, res) { 
     var emailpassed = req.body.email 

     var shaObj = new jsSHA('SHA-256', 'TEXT') 
     shaObj.update('zzzz' + req.body.password) 
     var hash = shaObj.getHash('HEX') 

     var params = { 
     TableName: 'passengers', 
     IndexName: 'emailpass', 
     ProjectionExpression: 'password', 
     KeyConditionExpression: '#yr = :yyyy', 
     ExpressionAttributeNames: { 
      '#yr': 'email' 
     }, 
     ExpressionAttributeValues: { 
      ':yyyy': emailpassed 
     } 
     } 

     docClient.query(params, function (err, data) { 
     if (err) { 
      console.log('No such user found.1') 

     } else { 
      data.Items.forEach(function (item) { 
      if (item.password != hash) { 
       console.log('Incorrect password.1') 
      } else { 

       var payload = {id: item.pid, password: hash} 
       var token = jwt.sign(payload, 'sa') 

       if (token) { 
       return res.json({token: token}) 

       } 
      } 

      }) 
      console.log('daaakey') 

     } 
     }) 
    return; 
    } 
) 
+0

Avez-vous vérifié la longueur de 'data.Items'? Assurez-vous que la longueur de 'date.Items' n'est pas plus de 1. –

+0

@Prakesh sharma Merci – Leonardo

Répondre

1

Vous appelez res.json() dans une boucle .forEach() qui signifie que vous pouvez appeler plus d'une fois tout temps data.Items.length est plus 1 et certaines autres conditions sont remplies. Rappelez-vous que lorsque vous faites return res.json(), le return revient du rappel .forEach() et ainsi la boucle .forEach() continue de s'exécuter et le rappel peut être rappelé. L'erreur que vous voyez est provoquée en essayant d'envoyer plus d'une réponse à une demande donnée qui n'est pas autorisée. Vous devez restructurer votre flux de code de manière à ce que votre boucle .forEach() collecte l'entrée (souvent dans un tableau) puis envoie une réponse contenant toutes les données après la fin de la boucle ou si vous avez seulement l'intention d'envoyer une réponse le premier jeton trouvé, alors vous voulez probablement passer à une boucle for régulière afin que vous puissiez sortir de la boucle après avoir envoyé la réponse (pour éviter d'en envoyer une autre) avec un return ou break. Il n'est pas clair à partir de votre code lequel de ces scénarios est votre intention probable (en envoyant seulement les premières données ou en accumulant toutes les données et en les envoyant toutes).

+0

Hmm Je pensais que le retour va sortir de la boucle for, pas vrai je suppose? – Leonardo

+0

@Leonardo - Regardez attentivement le code. Le 'return' est à l'intérieur de la fonction de rappel, donc il revient juste du callback. Les boucles '.forEach()' n'offrent aucune option de contrôle de flux, elles ne sont donc recommandées que si vous avez toujours l'intention d'exécuter l'itération complète. Une simple boucle 'for' peut être un peu plus typée, mais elle vous donne beaucoup d'options de contrôle de flux puisque vous pouvez« casser »ou« revenir »hors de la boucle à tout moment. – jfriend00

+0

Ok maintenant je vois merci :) – Leonardo