получить индекс из массива, используя Express + GraphQL - PullRequest
0 голосов
/ 03 января 2019

Я только пачкаю руки с GraphQL, используя Express.Я слежу за серией Academind YouTube для GraphQL-Express-Node-React .Я только что установил базовую схему GraphQL, где у меня есть жестко заданный массив строк, который возвращается.Я хочу создать Запрос, который дает мне индекс элемента из этого жестко закодированного массива, используя GraphQL (graphiql)

Код

const express = require('express'); // Add Express Module
const bodyParser = require('body-parser'); // Add Body-Parser Middleware for JSON handling in Requests
const graphqlHttp = require('express-graphql'); // Add Middleware for GraphQL Resolvers over Express HTTP
const { buildSchema } = require('graphql'); // Javascript Object-Destructuring (pull objects from packages)

const app = express();

app.use(bodyParser.json()); // JSON parsing Middleware added

app.use('/graphql', graphqlHttp({
    schema: buildSchema(`
        type RootQuery {
            events: [String!]!
            getEventIndex(eventName: String): Int
        }

        type RootMutation {
            createEvent(name: String): String
        }

        schema {
            query: RootQuery
            mutation: RootMutation
        }
    `),
    rootValue: {
        events: () => {
            return ['Cooking', 'All-Night Coding', 'Romantic'];
        },
        getEventIndex: (args) => {
            const _arr = ['Cooking', 'All-Night Coding', 'Romantic'];
            const index = _arr.findIndex(args.eventName);
            return index;
        },
        createEvent: (args) => {
            const eventName = args.name; // same as that of the parameter for `createEvent`
            return eventName;

        }
    },
    graphiql: true
}));

app.listen(3000);

Я создал запрос getEventIndex(eventName: String): Int, который принимаетв имени события и предоставляет мне индекс (который является целым числом)

Результат в graphiql

запрос

query {
  getEventIndex(eventName: "Cooking")
}

результат

{
  "errors": [
    {
      "message": "Cooking is not a function",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "getEventIndex"
      ]
    }
  ],
  "data": {
    "getEventIndex": null
  }
}

Почему Cooking здесь следует рассматривать как function, а не как аргумент в createEvent мутации?

Конечно, я прыгаю в GraphQL без особого углубления в его Спецификации, но я думаю, что он также способен обрабатывать запросы на основе параметров.

1 Ответ

0 голосов
/ 03 января 2019

Эта ошибка не относится к GraphQL.

Array.findIndex ожидает, что функция будет передана в качестве первого параметра.Функция вызывается для каждого элемента в массиве до тех пор, пока она не вернет истинное значение, после чего она вернет индекс этого элемента.Значение args.eventName не является функцией (это строка), поэтому вы получите эту ошибку.

Либо передайте ей функцию, например:

const index = _arr.findIndex(value => value === args.eventName)

или просто используйте Array.indexOf вместо этого, что, вероятно, вы и хотели сделать:

const index = _arr.indexOf(args.eventName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...