微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

如果我遇到错误,我希望它向前端返回 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() 调用和多次运行,因为它实际上并未结束我的代码运行。不知道这里发生了什么。任何帮助将不胜感激。

解决方法

您在 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 })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。