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

Posted

技术标签:

【中文标题】GraphQL 突变和查询:无法读取未定义的属性【英文标题】:GraphQL Mutation and Query: Cannot read property of undefined 【发布时间】:2021-11-08 22:06:02 【问题描述】:

我正在按照教程进行操作,并使用express-graphql 进行了简单的设置。我有一个突变来创建一个 Friend 对象和一个返回相同的查询。自动完成和模式检测在 localhost:8080/graphql 上运行的 GraphiQL 上运行良好。我尝试在 SO 上搜索类似的错误,但这些错误要么有复杂的示例,要么正在使用 Apollo。

这是我尝试执行的 GraphQL Mutation:

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 和 react,我一直将 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
    
  ]

【问题讨论】:

我认为这个错误是不言自明的。你为什么在createFriend(input: ...) ...中写inputInput 只是定义“合同”时“参数”的名称。这与在 javascript 中声明一个简单的函数相同。当你调用它时,你不会把参数的名字和值一起写,对吗? 同意,但请参阅上面的编辑,我尝试了各种不同的突变,我看到“预期名称,发现 ”错误。 使用了错误的解析器参数 .... graphql.org/learn/execution 【参考方案1】:

感谢@xadm 的评论,我得到了它的工作。查看查询解析器文档here,createFriend 突变签名如下所示:

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

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

createFriend: (input) => //Do something

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

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

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

【讨论】:

鼓励您接受自己的答案。这样它就不会再出现“未解决的答案”了。 同意,需要等待 24 小时才能接受我的回答

以上是关于GraphQL 突变和查询:无法读取未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:TypeError:无法读取未定义的属性

将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”

如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?

APOLLO CLIENT - 突变不起作用(无法读取未定义的属性“数据”)

TypeError:无法读取未定义的属性“类型”

UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“类型”