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 的评论,我让它开始工作了。查看查询解析器文档 here,createFriend
突变签名如下所示:
createFriend: (parent, {input}, context, info) => {//Do something}
在我最初的 post 中,我只提供了这个:
createFriend: ({input}) => {//Do something}
因为我对传递父参数并不感兴趣,所以我需要做的就是:
createFriend: (_, {input}) => {//Do something}
在不编辑我的突变查询或任何其他文件的情况下进行上述更改。希望其他人觉得这很有用。
我正在学习教程并使用 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 的评论,我让它开始工作了。查看查询解析器文档 here,createFriend
突变签名如下所示:
createFriend: (parent, {input}, context, info) => {//Do something}
在我最初的 post 中,我只提供了这个:
createFriend: ({input}) => {//Do something}
因为我对传递父参数并不感兴趣,所以我需要做的就是:
createFriend: (_, {input}) => {//Do something}
在不编辑我的突变查询或任何其他文件的情况下进行上述更改。希望其他人觉得这很有用。