#javascript #node.js #express #for-of-loop
Вопрос:
Я нахожусь в ситуации, когда у меня есть почтовый маршрут, который вызывает функцию несколько раз. Я хочу, чтобы запрос возвращал ошибку, если вызываемая функция возвращает ошибку, но я не уверен, как этого добиться. Видите это изображение:
Это мой код:
function POSTcord(lat, lng) {
axios
.post(process.env.SOS_POST_URL process.env.SOS_POST_CODE, {
batteryLevel: 100,
longitude: lng,
latitude: lat
})
.then(res => {
console.log(`statusCode: ${res.status}`)
})
.catch(error => {
console.error(error.message);
})
}
router.post('/test', async (req, res) => {
let passedCords = req.body;
try {
for (const cord of passedCords) {
POSTcord(cord.lat, cord.lng);
}
res.status(200).json({status:"success", message: "hello!"});
} catch (err) {
console.error(err.message);
res.status(500).send("Server error");
}
});
Я хочу, чтобы маршрут /test
возвращал ошибку, если функция POSTcord
обнаруживает ошибку где-то в цикле. Есть какие-нибудь идеи по этому поводу? Я думаю, что мог бы перейти res
к POSTcord
функциям, но это не сработало. Благодарен за любой вклад 🙂
Комментарии:
1. Множество проблем: ваша
POSTcord
функция ничего неreturn
делает, вы неawait
POSTcord()
выполняете вызов, и даже если бы вы сделали и то.catch(error => { console.error(error.message); })
, и другое, то проглотили бы любую ошибку и просто вернулисьundefined
.
Ответ №1:
Вам нужно вернуть обещание и убедиться, что ошибка выдана/отклонена:
Либо сделайте это:
function POSTcord(lat, lng) {
return axios // <--------------- THIS IS VERY IMPORTANT
.post(process.env.SOS_POST_URL process.env.SOS_POST_CODE, {
batteryLevel: 100,
longitude: lng,
latitude: lat
})
.then(res => {
console.log(`statusCode: ${res.status}`)
})
.catch(error => {
console.error(error.message);
throw error; // <----------- ALSO DO THIS
})
}
Или сделайте это:
function POSTcord(lat, lng) {
return axios // <--------------- THIS IS VERY IMPORTANT
.post(process.env.SOS_POST_URL process.env.SOS_POST_CODE, {
batteryLevel: 100,
longitude: lng,
latitude: lat
})
.then(res => {
console.log(`statusCode: ${res.status}`)
})
// DON'T CATCH THE ERROR!!
}
Тогда все, что вам нужно сделать, это await
получить сообщение об ошибке:
router.post('/test', async (req, res) => {
let passedCords = req.body;
try {
for (const cord of passedCords) {
await POSTcord(cord.lat, cord.lng); // DO THIS FOR CATCH TO WORK
}
res.status(200).json({status:"success", message: "hello!"});
} catch (err) {
console.error(err.message);
res.status(500).send("Server error");
}
});
Если вы хотите звонить POSTcord()
параллельно, вы можете await
использовать Promise.all()
:
router.post('/test', async (req, res) => {
let passedCords = req.body;
try {
let promises = [];
for (const cord of passedCords) {
let p = POSTcord(cord.lat, cord.lng);
promises.push(p);
}
await Promise.all(promises); // DO THIS FOR CATCH TO WORK
res.status(200).json({status:"success", message: "hello!"});
} catch (err) {
console.error(err.message);
res.status(500).send("Server error");
}
});