我只是使用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,但我想它也许也能够处理基于参数的查询。
答案 0 :(得分:1)
此错误并非特定于GraphQL。
Array.findIndex期望将函数作为其第一个参数传递。对数组中的每个元素都调用该函数,直到该函数返回真实值为止,然后该值返回该元素的索引。 args.eventName
的值不是一个函数(它是一个字符串),因此最终会出现该错误。
向其传递一个函数,例如:
const index = _arr.findIndex(value => value === args.eventName)
或仅使用Array.indexOf来代替,这可能就是您想做的:
const index = _arr.indexOf(args.eventName)