【问题标题】:express - Error: Can't set headers after they are sentexpress - 错误:发送后无法设置标题
【发布时间】:2017-10-01 06:17:35
【问题描述】:

您好,我尝试了所有方法,但以下非常简单的代码给了我“发送后无法设置标题”错误,我已经为此工作了几天,非常感谢您的输入。

  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;
  }
  )

【问题讨论】:

  • 你检查data.Items的长度了吗?确保date.Items的长度不超过1。
  • @Prakesh sharma 谢谢

标签: javascript node.js amazon-web-services express aws-sdk


【解决方案1】:

您在.forEach() 循环内调用res.json(),这意味着您可以在data.Items.length 超过1 并且满足其他一些条件时多次调用它。请记住,当您执行return res.json() 时,return 将从.forEach() 回调中返回,因此.forEach() 循环会继续运行,并且会再次调用回调。您看到的错误是由于尝试向不允许的给定请求发送多个响应而引起的。

您需要重组您的代码流,以便您的 .forEach() 循环收集输入(通常在一个数组中),然后在循环完成后发送一个包含所有数据的响应,或者如果您只打算发送一个响应在找到的第一个令牌上,您可能希望切换到常规的for 循环,以便在使用returnbreak 发送响应(以避免发送另一个)后跳出循环。从您的代码中不清楚您可能的意图是哪种情况(仅发送第一个数据或累积所有数据并全部发送)。

【讨论】:

  • 嗯,我认为 return 会跳出 for 循环,我猜不是真的?
  • @Leonardo - 仔细查看代码。 return 在回调函数中,所以它只是从回调中返回。 .forEach() 循环根本不提供流量控制选项,因此仅在您始终打算运行完整迭代时才建议使用它们。一个普通的for 循环可能需要更多的输入,但它为您提供了很多流量控制选项,因为您可以随时将breakreturn 退出循环。
  • @Leonardo - 如果这回答了您的问题,那么您可以通过单击答案左侧的复选标记向社区表明这一点。这也将为您在此处遵循正确的程序赢得一些声誉积分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多