Ошибка в асинхронной функции с условием

app.post('/post',async ({body}, res) => {
    const validatePost = await foo(body)
    const postResult = await foo2(body)

    res.status(200).json(validatePost ? postResult : {success:false})
})

foo и foo2 это асинхронные функции. Проблема в том что foo2 выполняется обходя условие, поэтому когда ей передаются неверные параметры - происходит краш. Насколько я знаю await должно противостоять этому.


Ответы (1 шт):

Автор решения: Alexander Yukal

Код покороче - не всегда надежен, к тому же каждый await необходимо оборачивать в try/catch и выводить ошибки в лог (но не на продакшн). Иначе вы рискуете потерять контекст ошибки, как минимум. Ну и для тестов желательно все кейсы прорабатывать, чтобы потом в продакшене у вас неыбло проблем.

app.post('/post',async ({body}, res) => {
    let validatePost;
    let postResult;

    try {
        validatePost = await foo(body);
    } catch(err) {
        console.error(err);
        res.status(500).json({ success: false });
        return;
    }

    if (!validatePost) {
        res.status(400).json({ success: false });
        return;
    }

    try {
        postResult = await foo2(body);
    } catch(err) {
        console.error(err);
        res.status(500).json({ success: false });
        return;
    }

    res.status(200).json(postResult);
});

или так:

class ValidationError extends Error {}

app.post('/post',async ({body}, res) => {
    let postResult;

    try {
        const validatePost = await foo(body);

        if (!validatePost) {
            throw new ValidationError('Some Validation Error');
        }

        postResult = await foo2(body);
    } catch(err) {
        const status = err instanceof ValidationError ? 400 : 500;
        res.status(status).json({ success: false });
        console.error(err);
        return;
    }

    res.status(200).json(postResult);
});

→ Ссылка