return res.status() 似乎没有结束我的代码运行?

时间:2021-01-09 20:58:45

标签: javascript node.js express

如果我遇到错误,我希望它向前端返回 res.status 一个错误,但是我收到一个错误:Cannot set headers after they are sent to the client,我假设这意味着它将转到下一个 res.status 和下一个,而不是出于某种原因实际返回。

betData.forEach(data => {
                    let storedAddress = `${data.address} ${data.city} ${data.state} ${data.zip}`;
                    let convertedAddress =`${addressData.data[0].delivery_line_1} ${addressData.data[0].last_line}`;
    
                    if(data.email.toLowerCase() === userInput.email.toLowerCase()){
                        return res.status(400).json({
                            message: `${userInput.email} has already been used this week.`
                        });
                    } else if (storedAddress === convertedAddress) {
                        return res.status(400).json({
                            message: `This address has already been used this week.`
                        });
                    } else {
                        const saveData = {
                            firstName: userInput.firstName,
                            lastName: userInput.lastName,
                            email: userInput.email,
                            address: addressData.data[0].delivery_line_1,
                            city: addressData.data[0].components.city_name,
                            state: addressData.data[0].components.state_abbreviation,
                            zip: addressData.data[0].components.zipcode,
                            favoriteTeam: userInput.favoriteTeam,
                            terms: userInput.terms,
                            agreeToEmail: userInput.agreeToEmail
                        }
                        saveGOTDBet(saveData).then(data => {
                            return res.status(200).json({
                                message: 'Bet successfully placed',
                            });
                        })
                    }
                });

如您所见,我有多次返回 res.status() 调用和多次运行,因为它实际上并未结束我的代码运行。不知道这里发生了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您在 forEach 中循环,它将为每个元素运行。举个更简单的例子,在你的 Node REPL 中试试这个:[1,2,3].forEach(x => console.log(x) || x)。即使它返回,它也只是返回然后继续下一次迭代。在 Promise 的 res.send 中还有一个 .then,如果该块被击中,这可能是一个进一步的问题。看起来您可能想要做的是在迭代 betData 时构建响应对象,并将您的条件和响应移出迭代。

这是一个如何工作的示例,但不知道为什么您有多个 betData 项要循环,我不确定它是否适合您的用例。此外,异步/承诺 saveGOTDBet 可能会继续成为问题。

let status = 200
let message = ''

betData.forEach(async (data) => {
  const storedAddress = `${data.address} ${data.city} ${data.state} ${data.zip}`
  const convertedAddress =`${addressData.data[0].delivery_line_1} ${addressData.data[0].last_line}`

  if (data.email.toLowerCase() === userInput.email.toLowerCase()) {
    status = 400
    message = message: `${userInput.email} has already been used this week.`
  } else if (storedAddress === convertedAddress) {
    status = 400
    message = `This address has already been used this week.`
  } else {
    const saveData = {
      firstName: userInput.firstName,
      lastName: userInput.lastName,
      email: userInput.email,
      address: addressData.data[0].delivery_line_1,
      city: addressData.data[0].components.city_name,
      state: addressData.data[0].components.state_abbreviation,
      zip: addressData.data[0].components.zipcode,
      favoriteTeam: userInput.favoriteTeam,
      terms: userInput.terms,
      agreeToEmail: userInput.agreeToEmail
    }

    await saveGOTDBet(saveData)
    status = 200
    message = 'Bet successfully placed',
  }
})

res.status(status).json({ message })
相关问题