GraphQL 突变和查询:无法读取未定义的 属性

GraphQL Mutation and Query: Cannot read property of undefined

我正在学习教程并使用 express-graphql 进行简单设置。我有一个突变来创建一个 Friend 对象和一个 return 相同的查询。 GraphiQL 运行 at localhost:8080/graphql 的自动完成和模式检测工作正常。我尝试在 SO 上搜索类似的错误,但这些错误要么有令人费解的例子,要么正在使用 Apollo。

这是我要执行的 GraphQL 变更:

mutation {
  createFriend(input: {
    firstName:"FName1",
    lastName:"LName1",
    email:"test@test.com"
  }) {
    id
  }
}

和我看到的错误(只显示错误的相关部分):

{
  "errors": [
    {
      "message": "Cannot read property 'input' of undefined",
// Erased irrelevant portion of error
}

这是我的 schema.js 文件,它从 resolvers.js 导入 resolvers 并使用 makeExecutableSchema:

import { resolvers } from './resolvers';
import { makeExecutableSchema } from '@graphql-tools/schema';

const typeDefs = `
    type Friend {
        id: ID
        firstName: String
        lastName: String
        age: Int
        email: String
    }

    type Query {
        getFriend(id: ID): Friend
    }

    input FriendInput {
        id: ID
        firstName: String!
        lastName: String
        age: Int
        email: String
    }

    type Mutation {
        createFriend(input: FriendInput): Friend
    }
`;

export const schema = makeExecutableSchema({ typeDefs, resolvers});

因为我只是在探索 graphQL 和做出反应,所以我一直在将 Friend 对象保存在一个数组中,如我的 resolver.js 文件中所示:

class Friend {
    constructor(id, { firstName, lastName, gender, age, language, email, contacts }) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.gender = gender;
        this.age = age;
        this.language = language;
        this.email = email;
        this.contacts = contacts;
    }
}

const friendDatabase = {};

// resolver map
export const resolvers = {
    Query: {
        getFriend: ({ id }) => {
            return new Friend(id, friendDatabase[id]);
        },
    },
    Mutation: {
        createFriend: ({ input }) => {
            let id = require('crypto').randomBytes(10).toString('hex');
            friendDatabase[id] = input;
            return new Friend(id, input);
        },
    },
};

最后,这是将所有内容联系在一起的 index.js 文件:

import express from 'express';
const { graphqlHTTP } = require('express-graphql');
import {schema} from './schema';

const app = express();

app.get('/', (req, res) => {
    res.send('GraphQL is amazing!');
});

app.use('/graphql', graphqlHTTP({
    schema: schema,
    graphiql: true,
}));

app.listen(8080, () => console.log('Running server on port localhost:8080/graphql'));

我发现本教程使用了一些过时的库(graphql-tools 而不是 @graphql-tools/schema),npm 日志向我指出了这些库。我一直在更新代码,但无法调试此错误。

任何指点将不胜感激。

编辑 根据@Viet 的评论,使用这个:

mutation {
  createFriend({
    firstName:"FName1",
    lastName:"LName1",
    email:"test@test.com"
  }) {
    id
  }
}

我现在收到这个错误:

{
  "errors": [
    {
      "message": "Syntax Error: Expected Name, found \"{\".",
// Removed extra lines
    }
  ]
}

感谢@xadm 的评论,我让它开始工作了。查看查询解析器文档 herecreateFriend 突变签名如下所示:

createFriend: (parent, {input}, context, info) => {//Do something}

在我最初的 post 中,我只提供了这个:

createFriend: ({input}) => {//Do something}

因为我对传递父参数并不感兴趣,所以我需要做的就是:

createFriend: (_, {input}) => {//Do something}

在不编辑我的突变查询或任何其他文件的情况下进行上述更改。希望其他人觉得这很有用。