如何解决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 举报,一经查实,本站将立刻删除。