Не получить идентификатор (он не определен) созданной записи в redux-саге в React-admin - PullRequest
0 голосов
/ 02 мая 2020

Это проблема. Я хотел поймать ID вновь созданной записи, поэтому я создал собственную сагу наблюдателя, которая слушает каждую RA / CRUD_CREATE_SUCCESS. И моей рабочей саге нужно получить идентификатор вновь созданной записи, чтобы я мог сделать второй вызов к другой конечной точке, используя этот идентификатор, с некоторыми другими данными.

Но по какой-то причине каждый раз, когда создается запись, саги наблюдателя делают действительно работает, но идентификатор этой записи не определен в полезной нагрузке. Все остальное есть, кроме идентификатора.

Я использую простую форму и создаю запись, как они объясняют в документации. Я использую response-admin ver. 2.9.7

Любые предложения, идеи, исправления приветствуются.

1 Ответ

0 голосов
/ 03 мая 2020

Согласно источнику, оба на 2.9.7,

https://github.com/marmelab/react-admin/blob/v2.9.7/packages/ra-core/src/actions/dataActions/crudCreate.ts#L86

и

https://github.com/marmelab/react-admin/blob/v2.9.7/packages/ra-core/src/types.ts#L7

Идентификатор должен быть там, на action.payload.id. Так как это не так, это либо ошибка реагирования с правами администратора, которую вы можете попытаться изменить, чтобы исправить версию, либо ваш dataProvider не возвращает идентификатор созданных ресурсов, но с этим, реакция-администратор, вероятно, будет жаловаться, и вы уже заметили ошибка, и после создания, если redirect = "edit", вы будете перенаправлены в / resource / undefined. Это происходит?

Если это ошибка ra, вы можете попытаться извлечь id из action.meta.redirectTo, если он там есть, или вообще не использовать sagas, перехватывать запросы dataProvider и каждый раз, когда запрос CREATE завершается успешно , сделайте ваш второй звонок:

import { CREATE } from 'react-admin'

const interceptorDataProvider = dataProvider = async (verb, resource, params) => {
     if (verb === CREATE) {

         let response

         try {
             response = await dataProvider(verb, resource, params)
         } catch (e) {
             return Promise.reject(e)//ra expects rejecteds promises
         }

         //do your second call with response.data.id
         return response             

     }

    return dataProvider(verb, resource, params)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...