2017-09-30 18 views
0

こんにちは私はすべてを試しましたが、以下の非常に単純なコードは私に "送信後にヘッダーを設定できません"というエラーを出しています。あなたが入力した日は高く評価されます。express - エラー:送信後にヘッダーを設定できません。

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

'data.Items'の長さを確認しましたか? 'date.Items'の長さが1を超えていないことを確認してください。 –

+0

@Prakesh sharmaありがとうございます – Leonardo

答えて

1

あなたはいつでもdata.Items.length回以上がより1で、他のいくつかの条件が満たされ、それを呼び出すことができることを意味し.forEach()ループ内res.json()を呼んでいます。 return res.json()を実行すると、return.forEach()コールバックから戻ってきており、したがって.forEach()ループが実行され続け、コールバックが再び呼び出されることに注意してください。表示されているエラーは、許可されていない要求に対して複数の応答を送信しようとした場合に発生します。

.forEach()ループが入力を収集して(多くの場合、配列で)ループを終了した後、またはすべてのデータを含む1つの応答を送信するようにコードフローを再構成する必要があります。最初のトークンが見つかった場合は、通常のforループに切り替える必要があるため、returnまたはbreakという応答を送信した後でループを中断することができます(別のものを送信しないようにする)。これらのシナリオのどれがあなたの可能性のある意図(最初のデータのみを送信するか、またはすべてのデータを蓄積し、すべて送信すること)があなたのコードから明らかではありません。

+0

うーん、私はリターンがforループから抜けると思っています。 – Leonardo

+0

@レオナルド - 慎重にコードを見てください。 'return'はコールバック関数の内部にあるので、コールバックから返ります。 '.forEach()'ループは、フロー制御オプションをまったく提供しないので、常に完全な反復を実行しようとしている場合にのみ、アドバイスされます。プレーンな 'for'ループは少しタイピングしているかもしれませんが、いつでもループから' break'または 'return'できるので、たくさんのフロー制御オプションを提供します。 – jfriend00

+0

オクラホマ今私は感謝を見る:) – Leonardo

関連する問題