为什么 GraphQL 不接受这种标量参数类型,而是抱怨 "argument type must be Input Type but got: undefined"?
Why doesn't GraphQL accept this scalar argument type, instead complaining "argument type must be Input Type but got: undefined"?
我有
export const getPicture = {
type: GraphPicture,
args: {
type: new GraphQLNonNull(GraphQLInt)
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
export const getPictureList = {
type: new GraphQLList(GraphPicture),
resolve(_, __, session) {
return Picture.findAll({where: {owner: session.userId}});
}
};
和
const query = new GraphQLObjectType({
name: 'Queries',
fields: () => {
return {
getPictureList: getPictureList,
getPicture: getPicture
}
}
});
const schema = new GraphQLSchema({
query: query,
mutation: mutation
});
抛出:
Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined.
getPictureList
工作正常; getPicture
失败,标量参数类型为 GraphQLInt
或 GraphQLNonNull(GraphQLInt)
。我试过将 getPicture
变成 GraphQLLIst
,但没有用。我曾尝试将参数 type
设为输入类型,但没有用。
为什么代码会产生错误,如何修复?
堆栈跟踪是:
Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined.
at invariant (/home/jrootham/dev/trytheseon/node_modules/graphql/jsutils/invariant.js:19:11)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:307:33
at Array.map (native)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:304:52
at Array.forEach (native)
at defineFieldMap (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:293:14)
at GraphQLObjectType.getFields (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:250:46)
at /home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:224:27
at typeMapReducer (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:236:7)
at Array.reduce (native)
at new GraphQLSchema (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:104:34)
at Object. (/home/jrootham/dev/trytheseon/server/graphQL.js:45:16)
at Module._compile (module.js:399:26)
at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
at Object.require.extensions.(anonymous function) [as .js] (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:173:7)
at Module.load (module.js:345:32)
at Function.Module._load (module.js:302:12)
at Module.require (module.js:355:17)
at require (internal/module.js:13:17)
at Object. (/home/jrootham/dev/trytheseon/devServer.js:14:44)
at Module._compile (module.js:399:26)
at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
问题不在于查询的 return 类型,而在于您为参数指定的类型。
export const getPicture = {
type: GraphPicture,
args: {
type: new GraphQLNonNull(GraphQLInt)
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
假设您想要一个名为 "type" 的参数,它应该是:
export const getPicture = {
type: GraphPicture,
args: {
type: {
type: new GraphQLNonNull(GraphQLInt)
}
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
这是来自 graphql-js 存储库的示例:
hero: {
type: characterInterface,
args: {
episode: {
description: 'If omitted, returns the hero of the whole saga. If ' +
'provided, returns the hero of that particular episode.',
type: episodeEnum
}
},
resolve: (root, { episode }) => getHero(episode),
},
在此处查看 graphql-js 存储库中的完整架构:https://github.com/graphql/graphql-js/blob/master/src/tests/starWarsSchema.js
仅供参考,我来到这里搜索同样的错误,但不是使用 undefined
,而是使用我自己的 Product
类型:
... argument * must be Input Type but got Product
事实证明,在 GraphQL 中,您传递给 Mutation 的内容应该是标量类型(字符串、整数...)或用户定义的 input
类型,不是 type
类型。
http://graphql.org/graphql-js/mutations-and-input-types/
input ProductInput {
id: ID
name: String
}
我试图传递我的产品 type
:
type Product {
id: ID
name: String
}
这感觉有点多余,但猜猜,我会很高兴稍后将它分开。
我有
export const getPicture = {
type: GraphPicture,
args: {
type: new GraphQLNonNull(GraphQLInt)
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
export const getPictureList = {
type: new GraphQLList(GraphPicture),
resolve(_, __, session) {
return Picture.findAll({where: {owner: session.userId}});
}
};
和
const query = new GraphQLObjectType({
name: 'Queries',
fields: () => {
return {
getPictureList: getPictureList,
getPicture: getPicture
}
}
});
const schema = new GraphQLSchema({
query: query,
mutation: mutation
});
抛出:
Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined.
getPictureList
工作正常; getPicture
失败,标量参数类型为 GraphQLInt
或 GraphQLNonNull(GraphQLInt)
。我试过将 getPicture
变成 GraphQLLIst
,但没有用。我曾尝试将参数 type
设为输入类型,但没有用。
为什么代码会产生错误,如何修复?
堆栈跟踪是:
Error: Queries.getPicture(type:) argument type must be Input Type but got: undefined. at invariant (/home/jrootham/dev/trytheseon/node_modules/graphql/jsutils/invariant.js:19:11) at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:307:33 at Array.map (native) at /home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:304:52 at Array.forEach (native) at defineFieldMap (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:293:14) at GraphQLObjectType.getFields (/home/jrootham/dev/trytheseon/node_modules/graphql/type/definition.js:250:46) at /home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:224:27 at typeMapReducer (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:236:7) at Array.reduce (native) at new GraphQLSchema (/home/jrootham/dev/trytheseon/node_modules/graphql/type/schema.js:104:34) at Object. (/home/jrootham/dev/trytheseon/server/graphQL.js:45:16) at Module._compile (module.js:399:26) at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5) at Object.require.extensions.(anonymous function) [as .js] (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:173:7) at Module.load (module.js:345:32) at Function.Module._load (module.js:302:12) at Module.require (module.js:355:17) at require (internal/module.js:13:17) at Object. (/home/jrootham/dev/trytheseon/devServer.js:14:44) at Module._compile (module.js:399:26) at normalLoader (/usr/lib/node_modules/babel/node_modules/babel-core/lib/babel/api/register/node.js:160:5)
问题不在于查询的 return 类型,而在于您为参数指定的类型。
export const getPicture = {
type: GraphPicture,
args: {
type: new GraphQLNonNull(GraphQLInt)
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
假设您想要一个名为 "type" 的参数,它应该是:
export const getPicture = {
type: GraphPicture,
args: {
type: {
type: new GraphQLNonNull(GraphQLInt)
}
},
resolve(_, args) {
return Picture.findByPrimary(args.id);
}
};
这是来自 graphql-js 存储库的示例:
hero: {
type: characterInterface,
args: {
episode: {
description: 'If omitted, returns the hero of the whole saga. If ' +
'provided, returns the hero of that particular episode.',
type: episodeEnum
}
},
resolve: (root, { episode }) => getHero(episode),
},
在此处查看 graphql-js 存储库中的完整架构:https://github.com/graphql/graphql-js/blob/master/src/tests/starWarsSchema.js
仅供参考,我来到这里搜索同样的错误,但不是使用 undefined
,而是使用我自己的 Product
类型:
... argument * must be Input Type but got Product
事实证明,在 GraphQL 中,您传递给 Mutation 的内容应该是标量类型(字符串、整数...)或用户定义的 input
类型,不是 type
类型。
http://graphql.org/graphql-js/mutations-and-input-types/
input ProductInput {
id: ID
name: String
}
我试图传递我的产品 type
:
type Product {
id: ID
name: String
}
这感觉有点多余,但猜猜,我会很高兴稍后将它分开。