使用Express + GraphQL从数组获取索引

时间:2019-01-03 12:17:38

标签: node.js express graphql

我只是使用Express使用GraphQL弄脏了我的手。我正在关注Academind YouTube Series for 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规范的情况下跳入了GraphQL,但我想它也许也能够处理基于参数的查询。

1 个答案:

答案 0 :(得分:1)

此错误并非特定于GraphQL。

Array.findIndex期望将函数作为其第一个参数传递。对数组中的每个元素都调用该函数,直到该函数返回真实值为止,然后该值返回该元素的索引。 args.eventName的值不是一个函数(它是一个字符串),因此最终会出现该错误。

向其传递一个函数,例如:

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

或仅使用Array.indexOf来代替,这可能就是您想做的:

const index = _arr.indexOf(args.eventName)