Я пытаюсь передать массив в качестве параметра в 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.
Конфигурация для 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
используется по умолчанию.