«AxiosError: параметры должны быть объектом: «ERR_BAD_OPTION_VALUE»

Я пытаюсь передать массив в качестве параметра в axios get. Это реагирующее приложение, использующее текущие пакеты.

Я использовал код для решения других подобных проблем. Я попытался применить два разных метода/формы синтаксиса, как видно из прокомментированного кода.

Вот код:

import Qs from "qs";
import axios from "axios";

console.info(
  "ContactContainer - useEffect[currentUser] - Before check of currentUser.contactRequestsTo.length > 0 ",
  currentUser.contactRequestsTo.length
);
const userIds = JSON.stringify(currentUser.contactRequestsTo);
//const userIds = currentUser.contactRequestsTo;
console.info("ContactContainer - useEffect[currentUser] - userIds ", userIds);
if (currentUser.contactRequestsTo.length > 0) {
  (async () => {
    //const contactRequestsToDetails = await axios.get(`${getUserDetailsRoute}`,{
    //  params: {
    //    arrayOfUserIds: userIds
    //  },
    //  paramsSerializer: (params) => Qs.stringify(params, {arrayFormat: 'repeat'})
    //});

    const instance = axios.create({
      paramsSerializer(params) {
        return Qs.stringify(params, { arrayFormat: "brackets" });
      },
    });

    const contactRequestsToDetails = await instance.get(getUserDetailsRoute);

    console.info(
      "ContactContainer - useEffect[currentUser] - contactRequestsToDetails = ",
      contactRequestsToDetails
    );
  })();
}

Вот некоторые из версий пакета:

    "axios": "^1.2.1",
    "mongoose": "^6.8.0",
    "qs": "^6.11.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",

Необработанный массив currentUser.contactRequestsTo:

ContactContainer - useEffect[] - currentUser.contactRequestsTo =  
Array(2)
0:"63b476a79c42d2b60fc39cbc"
1:"63b476ea9c42d2b60fc39ccd"
length:2
[[Prototype]]:Array(0)

Я попытался использовать необработанный массив в качестве входных данных, которые затем применили JSON.Stringify к массиву, чтобы получить идентификаторы пользователей, показанные ниже:

userIds  ["63b476a79c42d2b60fc39cbc","63b476ea9c42d2b60fc39ccd"]

Я также использовал два формата: один закомментирован, а другой показан.

Во всех случаях я получил ту же ошибку.

Uncaught (in promise) 
code:"ERR_BAD_OPTION_VALUE"
message:"options must be an object"
name:"AxiosError"
stack:"AxiosError: options must be an object\n    at Object.assertOptions (http://localhost:8080/static/js/main.d2f30e44.js:2:356049)\

Я вижу, что другие пользователи столкнулись с той же ошибкой и применили изменения, как я интерпретировал решения.

Что-то не так с моим синтаксисом или какая-то другая проблема, которая может вызвать эту ошибку?

🤔 А знаете ли вы, что...
JavaScript является одним из трех основных языков веб-разработки, вместе с HTML и CSS.


603
1

Ответ:

Решено

Конфигурация для paramsSerializer изменена в версии 1.0.0. Теперь это объект со свойствами encode, serialize и indexes.

Если вы хотите добавить квадратные скобки в массивы параметров запроса, используйте следующее. Кроме того, не сериализуйте массив в JSON.

(async () => {
  const currentUser = {
    contactRequestsTo: [
      "63b476a79c42d2b60fc39cbc",
      "63b476ea9c42d2b60fc39ccd"
    ],
  };
  const getUserDetailsRoute = "https://echo.zuplo.io/"; // just for the demo

  const contactRequestsToDetails = await axios.get(getUserDetailsRoute, {
    params: {
      arrayOfUserIds: currentUser.contactRequestsTo, // the actual array
    },
    paramsSerializer: {
      indexes: false, // empty brackets like `arrayOfUserIds[]`
    },
  });

  console.info(contactRequestsToDetails.data.url);
})();
<script src = "https://cdnjs.cloudflare.com/ajax/libs/axios/1.2.2/axios.min.js" integrity = "sha512-QTnb9BQkG4fBYIt9JGvYmxPpd6TBeKp6lsUrtiVQsrJ9sb33Bn9s0wMQO9qVBFbPX3xHRAsBHvXlcsrnJjExjg= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"></script>

Смотрите https://github.com/axios/axios#request-config


Непонятно, почему вы считаете, что вам вообще нужно использовать paramsSerializer, поскольку indexes: false используется по умолчанию.