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