Не удалось выполнить «выборку» в «окне»: запрос с методом GET/HEAD не может иметь тело в реакции-администраторе

Я использую react-adminframework и написал свой собственный DataProvider. Я пытаюсь сделать так, чтобы при создании пользователя также создавался экземпляр UserPossession. Мой код ниже выполняет это, но react-admin Front-end просто отображает предупреждающее сообщение:

Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body 

Я проверил вкладку «Сеть» в инструментах разработчика, и каждый запрос к серверу правильный, ошибок нет. Что оставляет меня в замешательстве и застрял с этим, потому что я понятия не имею, что означает это предупреждение или почему оно вообще происходит.

Мой код является частью константы convertDataRequestToHTTP и выглядит так:

if (resource === 'User') {
  url = `${apiUrl}/${resource}`;
  options.body = params.data;
  httpClient(url, {
    method: 'POST',
    body: JSON.stringify(options.body),
  })
  .then(response => (
    url = `${apiUrl}/Location`,
    options.method = 'POST',
    options.body = JSON.stringify({
       "odata.type": "HardwareDatabase.UserPossession",
       "Name": response.json.Login,
       "UserId": response.json.Id
    }),
    httpClient(url, {
      method: options.method,
      body: options.body
    })
  ));
}

Если есть вопросы по коду могу уточнить.

Спасибо за любые идеи заранее.


person AdamSulc    schedule 18.06.2019    source источник
comment
if (resource === 'User') { resource = 'User'; Если ресурс USER, установить ресурс USER?   -  person tic    schedule 19.06.2019
comment
Также является ли это допустимым синтаксисом js? .then(response => ( resource = 'Location',. Этот код говорит, что после завершения обещания возвращается объект, но resource = 'Location', не является допустимым конструктором объекта. Возможно, вы хотели использовать { вместо (, но тогда не следует заканчивать строки запятыми...   -  person tic    schedule 19.06.2019
comment
@tic Я отредактирую код, чтобы он не содержал этой бесполезной строки, синтаксис правильный.   -  person AdamSulc    schedule 19.06.2019
comment
Вы не можете отправить тело в запросе GET, если вы хотите запросить некоторые данные, вы можете передать их через URL-адрес в качестве параметров запроса, в противном случае вы можете вместо этого изменить API на запрос POST.   -  person Khaled Osman    schedule 19.06.2019
comment
@KhaledOsman Но я использую метод POST, насколько мне известно, верно?   -  person AdamSulc    schedule 19.06.2019
comment
@AdamSulc сообщение об ошибке намекает на то, что оно каким-то образом настроено неправильно, вы можете добавить какой-нибудь console.logs или оператор отладчика и увидеть отправляемый ответ, или взглянуть на вкладку сети в chrome devtools и посмотреть, действительно ли это сообщение метод   -  person Khaled Osman    schedule 19.06.2019
comment
@KhaledOsman Я использую расширение под названием Debugger для Chrome и установил несколько точек останова, где проверил значения, которые мне кажутся правильными. Кроме того, вкладка «Сеть» возвращает только правильные вызовы на серверную часть. Это действительно странно. Хотя за идеи спасибо.   -  person AdamSulc    schedule 20.06.2019


Ответы (1)


Поскольку вы заявляете, что этот фрагмент кода является частью convertDataRequestToHTTP, я могу увидеть проблему. httpClient нельзя использовать в этой константе, поскольку она создает дублирующие вызовы API или, в вашем случае, это предупреждение. Правильным способом было бы указать только константу options.

url = `${apiUrl}/${resource}`;
options.body = JSON.stringifiy(params.data);
options.method = 'POST';

Позже в константе, которая преобразует ответ из OData в обязательный формат React Admin, укажите httpClient.

 params.data = {
    "odata.type": "HardwareDatabase.UserPossession",
    "Name": response.json.Login,
    "UserId": response.json.Id
 };
 httpClient(`${apiUrl}/Location`, {
    method: 'POST',
    body: JSON.stringify(params.data),
 })
person Adam Šulc    schedule 20.06.2019