javascript - 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',
});
})
}
});
如您所见,我有多个 return res.status() 调用和多个运行,因为它实际上并没有结束我的代码运行。不知道这里发生了什么。任何帮助,将不胜感激。
解决方案
您正在循环 a forEach
,它将针对每个元素运行。举一个更简单的例子,在你的 Node REPL: 中试试这个[1,2,3].forEach(x => console.log(x) || x)
。即使它返回,它也只是返回然后继续下一次迭代。你也有一个aa 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 })
推荐阅读
- xaml - XAML 上的属性列表
- python - RelatedObjectDoesNotExist 用于具有标准用户模型的foreginkey 模型
- flutter - 当 assembleDebug Out of Memory 错误被抛出
- android - RxJava Sqlite 插入返回零参数构造函数错误
- android - 具有 3 个视图和屏障的 MotionLayout
- python - 训练 NN 后无法绘制 matplotlib fig
- pandas - pandas groupby 后跟 resample 与索引中的日期时间和不同列中的日期时间的工作方式不同
- java - 使用 java 归档文件中的类
- vb.net - 下载文件代码出现意外的 404 错误
- java - Spring 5 webflux 如何为现有的 Webclient 设置超时