2017-09-30 2 views
0

Hallo Ich habe versucht, alles, aber der folgende sehr einfache Code gibt mir die "Kann nicht festlegen, Header, nachdem sie gesendet werden" Fehler, ich habe daran gearbeitet für Tage, an denen Sie Input erhalten, werden sehr geschätzt.express - Fehler: Kopfzeilen können nach dem Senden nicht gesetzt werden

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

Haben Sie die Länge von 'data.Items' überprüft? Stellen Sie sicher, dass die Länge von "date.Items" nicht mehr als 1 ist. –

+0

@Prakesh sharma Danke – Leonardo

Antwort

1

Du res.json() in einer .forEach() Schleife aufrufen, die bedeutet, dass Sie es mehr als einmal jederzeit anrufen kann data.Items.length ist mehr als 1 und einige andere Bedingungen erfüllt sind. Denken Sie daran, dass, wenn Sie return res.json() tun, die return von der .forEach() Rückruf zurückkehrt und damit die .forEach() Schleife läuft und der Rückruf wieder aufgerufen werden. Der Fehler, den Sie sehen, wird verursacht, indem Sie versuchen, mehr als eine Antwort an eine bestimmte Anfrage zu senden, die nicht erlaubt ist.

Sie müssen Ihren Code so strukturieren, dass entweder Ihre .forEach()-Schleife Eingaben sammelt (oft in einem Array) und dann eine Antwort sendet, die alle Daten enthält, nachdem die Schleife ausgeführt wurde oder wenn Sie nur eine Antwort senden möchten Wenn Sie das erste Token gefunden haben, möchten Sie wahrscheinlich zu einer normalen for-Schleife wechseln, damit Sie nach dem Senden der Antwort (um das Senden eines weiteren zu vermeiden) mit der return oder break aus der Schleife ausbrechen können. Es ist aus Ihrem Code nicht klar, welches dieser Szenarien Ihre wahrscheinliche Absicht ist (nur die ersten Daten senden oder alle Daten sammeln und alles senden).

+0

Hmm Ich dachte, Rückkehr wird aus der for-Schleife ausbrechen, nicht wahr, denke ich? – Leonardo

+0

@Leonardo - Schauen Sie sich den Code sorgfältig an. Das 'return' befindet sich innerhalb der Callback-Funktion, so dass es nur vom Callback zurückkehrt. '.forEach()' Schleifen bieten überhaupt keine Flusskontrolloptionen, daher werden sie nur empfohlen, wenn Sie immer die gesamte Iteration ausführen möchten. Eine einfache "for" -Schleife mag ein bisschen mehr tippen, aber es gibt Ihnen viele Möglichkeiten zur Flusskontrolle, da Sie jederzeit "ausbrechen" oder "zurückkehren" können. – jfriend00

+0

Ok jetzt sehe ich danke :) – Leonardo

Verwandte Themen