Задать вопрос
@iggymori

Как правильно получить сообщение об ошибке в стор с помощью Effector, Axios?

Здравствуйте! Мне необходимо получить и вывести сообщение в случае ошибки при совершении запроса.
Однако для этого мне нужно засунуть в стор сообщение об ошибке. Ниже будет показана реализации.
С сервера мне прилетает следующая информация:

{
"detail": {
"ProviderError": null,
"Code": 310,
"Message": "В запрашиваемую дату поездов нет",
"MessageParams": []
}
}


Вот логика стейт-менеджера Effector при запросе:
export const getTrains = createEvent<Object>();
const getTrainsFx = createEffect({handler: (trains: Object) => getTrainsHandler(trains)});
export const $getTrainsStore = createStore<ITrains[]>([]);
export const $isGetTrainsLoaded = createStore<boolean>(false).on(getTrainsFx.done, () => true);

forward ({from: getTrains, to: getTrainsFx});
forward ({from: getTrainsFx.doneData, to: $getTrainsStore});
export const $getTrainsErrorStore = createStore<string>(false).on(getTrainsFx.fail, () => getTrainsFx.failData )


Вот функция getTrainsHandler:
export  async function getTrainsHandler(params: Object){

    const json = JSON.stringify(params);
    try{
        const res = await axios.post(url+'Railway/get_trains', json ,{
               headers: {
                'Content-Type': 'application/json'
               }
        });
        return res.data.Trains;    
       
    } catch(error: any){
        return error.response.data.detail.Message;
 
    }
}


Подскажите пожалуйста, как это можно реализовать?
  • Вопрос задан
  • 155 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@marselo777
React developer
Вам нужно пробросить ошибку в блоке catch throw error.response.data.detail.Message;
А стор переписать в таком виде:
export const $getTrainsErrorStore = restore(getTrainsFx.failData, "")

Так же нужно будет добавить типизацию для эффекта, т.к вы будет возвращать ошибку в своем формате в виде строки.
const getTrainsFx = createEffect<object, any, string>({handler: (trains: Object) => getTrainsHandler(trains)});

P.S но лучше завязаться на интерфейс ошибки по умолчанию, чтобы не приходилось типизировать.
throw new Error('your message') и уже потом через error.message класть в стор.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы