Я пытаюсь вернуть некоторые данные из API, который выдает сообщение об ошибке «userAPI.filter не является функцией». Проект настроен с помощью json-сервера, и у меня также есть файл db.js с массивом объектов. Проблема, с которой я столкнулся, - заставить фильтр работать с json-сервером. Я уже протестировал его и без проблем могу получить данные из локального файла .js. Я даже могу вернуть данные с json-сервера, чтобы получить всех пользователей.
Когда я использую фильтр внизу, он просто не работает. У меня такое чувство, что это как-то связано с данными, которые я получаю с помощью axios, возможно, переменная не является массивом? Но это помогает вернуть всех пользователей. И я почти уверен, что фильтр работает правильно, поскольку он работает с тестовым массивом объектов userAPI2 в файле.
const axios = require('axios');
const Query = {
greeting(parent, args, ctx, info) {
if (args.name) {
return `Hello ${args.name}!`
} else {
return 'Hello!'
}
},
avengers(parent, args, ctx, info) {
if (args.name) {
return `Your favourite character is ${args.name}`
} else {
return 'Avengers Assemble!'
}
},
hello(parent, args, ctx, info) {
return "Hello World"
},
me() {
return {
id: "abc123",
name: "John",
email: "[email protected]",
age: 32
}
},
users(parent, args, {db}, info) {
// Import from an external API server in this case json-server
const userAPI = axios.get('http://localhost:3004/users')
.then(response => {
return response.data
})
if (!args.query) {
// Import from local .js file
return db.users
// Import from an external API server in this case json-server
//return userAPI
}
// Import from local .js file
// return db.users.filter((user) => {
// return user.name.toLowerCase().includes(args.query.toLowerCase())
// })
const userAPI2 = [
{
id: '1',
name: 'User1',
email: '[email protected]',
age: 32,
},
{
id: '2',
name: 'User2',
email: '[email protected]',
age: 32,
},
{
id: '3',
name: 'User3',
email: '[email protected]',
age: 32,
}
]
// Import from local .js file
// return db.users.filter((user) => {
// return user.name.toLowerCase().includes(args.query.toLowerCase())
// })
// Import from an external API server in this case json-server
return userAPI.filter((user) => {
return user.name.toLowerCase().includes(args.query.toLowerCase())
})
}
}
export {Query as default}
@MohsenZareZardeyni Я только что попытался снова зарегистрировать его, там написано "Promise {" pending "} <state>:" pending "<prototype>: PromiseProto {…} index.js: 30". Итак, теперь я думаю, что это потому, что мне нужно вернуть response.data, а затем передать его в массив.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Переменная userAPI содержит возвращаемое значение вызова axios.get. Методы запроса Axios (например, request, get, post и т. д.) Возвращают обещание, которое будет преобразовано в объект ответа. Именно этот объект ответа содержит data, который в данном случае будет массивом.
Если вы хотите записать данные в filter, вы должны сделать это в цепочке обещаний, возвращаемой преобразователем, например:
users(parent, args, {db}, info) {
return axios.get('http://localhost:3004/users')
.then(response => {
if (!args.query) {
return response.data
}
return response.data.filter((user) => {
return user.name.toLowerCase().includes(args.query.toLowerCase())
})
})
}
Или используя async / await:
users: async (parent, args, {db}, info) => {
const { data } = await axios.get('http://localhost:3004/users')
if (!args.query) {
return data
}
return data.filter((user) => {
return user.name.toLowerCase().includes(args.query.toLowerCase())
})
}
Большое спасибо, что код сработал. Я полагал, что это было вызвано обещаниями и аксиомами.
Еще одна вещь. Код для использования обещаний работает нормально. Однако код для использования async / await выдает ошибку. await is a reserved word
Вы включили ключевое слово async?
Ой, извините, моя беда, я скопировал код внутри функции и пропустил ключевое слово async ... Еще раз все работает, спасибо!
кажется, что userAPI - это не массив! вы пробовали регистрировать это? а если это массив, то используйте
Array.from