Ошибка возврата узла/Экспресс в основную функцию?

#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");
      }
});