#rtk-query
#rtk-запрос
Вопрос:
Я пытаюсь использовать error / isError для проверки, не удался ли запрос, но он всегда не определен.
Это мой сервис (я установил URL на: «non_exists_url»)
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' import { ICompanyDeleteRequest, ICompanyDeleteResponse } from '../../interfaces/companies.interface' import { RootState } from '../redux/store' export const companyApi = createApi({ reducerPath: 'companyApi', baseQuery: fetchBaseQuery({ baseUrl: 'http://localhost:1000/v1/', prepareHeaders: (headers, { getState }) =gt; { const token = (getState() as RootState).authReducer.token if (token) { headers.set('authorization', `Bearer ${token}`) } return headers }, }), endpoints: (builder) =gt; ({ deleteCompany: builder.querylt;ICompanyDeleteResponse, ICompanyDeleteRequestgt;({ query: ({ companyId }) =gt; ({ url: `non_exists_url`, method: 'DELETE', headers: { 'X-CompanyId': companyId, }, }), }) }), }) export const { useDeleteCompanyQuery } = companyApi
И это находится внутри компонента:
import styles from './deleteCompany.module.scss' import { FC, useEffect, useState } from 'react' export const DeleteCompany: FC = () =gt; { const companyId = 1 const { data, error, isError } = useDeleteCompanyQuery(companyId) useEffect(() =gt; { console.log('data', data) console.log('error', error) console.log('isError ', isError ) }, [data, error, isError ]) return ( lt;divgt; Some text lt;/divgt; ) }
В сети инструментов разработчика я вижу ошибку 404 Но в консоли ошибка и ошибка не определены
Есть идеи, чего мне не хватает ?
Комментарии:
1. Вы завернули api в свой редуктор? У меня однажды была похожая проблема, и это было потому, что я забыл добавить в свой рутрЕдуктор
2. Да, я завернул его.
3. Я думаю, это связано с тем, что 404 возвращает HTML, а RTK пытается его разобрать и застрял.
4. попробуйте добавить
responseHandler: (response) =gt; response.text()
в соответствии с вашим запросом. Если это не сработает, я предлагаю вам опубликовать эту проблему на странице RTKQ github, там вы сможете получить более быстрый и точный ответ5. Спасибо, я добавил это: « ResponseHandler: (ответ: Ответ) =gt; { console.log(‘ответ’, ответ) возвращает новое обещание(асинхронное (разрешение) =gt;gt; разрешение(ожидание ответа.текст ()))}`, » И я вижу в ответе response.status === 404, но все равно не получаю его с помощью крючка
Ответ №1:
Я обнаружил, что вместо этого использовал мутацию запроса для операции удаления. Запрос ожидает получить функцию JSON / text / или обратного вызова в качестве ответа, но ошибка 404 возвращает HTML, который не может быть проанализирован как JSON.
В итоге я перешел на такую мутацию:
В служебном файле:
deleteCompany: builder.mutationlt;ICompanyDeleteResponse, ICompanyDeleteRequestgt;({ query: ({ companyId }) =gt; ({ url: `PreventDelete/companies`, method: 'DELETE', }), })
Использование его в компоненте:
const [deleteCompany, { data, error, isLoading }] = useDeleteCompanyMutation() useEffect(() =gt; { console.log('data', data) console.log('error', error) console.log('isLoading', isLoading) if (!error amp;amp; data) { NotificationManager.success('Deleting company success', `Company ${company.id} deleted successfully`) } else if (error) { NotificationManager.error('Delete company error', `Error deleting company ${company.id}, details: ${data}`) } }, [data, error, isLoading])