Запрос GraphQL возвращает ошибку. Фильтр не является функцией

Я пытаюсь вернуть некоторые данные из 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}

кажется, что userAPI - это не массив! вы пробовали регистрировать это? а если это массив, то используйте Array.from

Mohsen ZareZardeyni 15.12.2018 16:46

@MohsenZareZardeyni Я только что попытался снова зарегистрировать его, там написано "Promise {" pending "} <state>:" pending "<prototype>: PromiseProto {…} index.js: 30". Итак, теперь я думаю, что это потому, что мне нужно вернуть response.data, а затем передать его в массив.

Andrew Baisden 15.12.2018 16:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 033
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменная 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())
  })
}

Большое спасибо, что код сработал. Я полагал, что это было вызвано обещаниями и аксиомами.

Andrew Baisden 15.12.2018 17:13

Еще одна вещь. Код для использования обещаний работает нормально. Однако код для использования async / await выдает ошибку. await is a reserved word

Andrew Baisden 15.12.2018 17:23

Вы включили ключевое слово async?

Daniel Rearden 15.12.2018 19:05

Ой, извините, моя беда, я скопировал код внутри функции и пропустил ключевое слово async ... Еще раз все работает, спасибо!

Andrew Baisden 15.12.2018 19:14

Другие вопросы по теме