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: ...) ...
中写input? Input 只是定义“合同”时“参数”的名称。这与在 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 突变和查询:无法读取未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章
将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”
如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?