#javascript #node.js #express
#javascript #node.js #выразить
Вопрос:
Если я столкнусь с ошибкой, я бы хотел, чтобы 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() и несколько запусков, потому что на самом деле это не завершает выполнение моего кода. Не уверен, что здесь происходит. Буду признателен за любую помощь.
Ответ №1:
Вы выполняете цикл в a forEach
, который будет выполняться для каждого элемента. Для более простого примера попробуйте сделать это в вашем Node REPL: [1,2,3].forEach(x => console.log(x) || x)
. Даже если он возвращается, он только возвращается, а затем переходит к следующей итерации. У вас также есть одно 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 })
Комментарии:
1. Я не уверен, что полностью понимаю, можете ли вы попытаться разбить этот ответ, как будто я глупый?
2. У вас есть свои
res.send
res.status
вызовы and в условиях, которые работают, но вы вызываете их в цикле; даже если вы возвращаетесь из цикла, это просто возврат к следующей итерации. Итак, если у вас есть десять элементовbetData
, весь обратный вызов вызывается 10 раз, включая все эти ответы, отсюда и ошибки. Вместо этого, что вы, вероятно, хотите сделать, это удалить всеres.send
s из обратногоforEach
вызова, использовать код в обратном вызове, чтобы решить, какими должны быть ответы (например, с некоторыми переменными над ним), а затем выполнить ответ после этого. Обновлено примером.