[英]GraphQL: One of the provided types for building the Schema is missing a name
我正在学习 GraphQL 所以我遇到了一个奇怪的问题
我在一个文件 Schema.js 上有这段代码:
const graphQL = require('graphql');
const lodash = require('lodash')
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;
const StatusType = new GraphQLObjectType({
name: 'Status',
fields: () => ({
id: { type: GraphQLInt },
statusName: { type: GraphQLString },
user: {
type: new GraphQLList(UserType),
resolve(parentValue, args){
}
}
})
});
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLString },
username: { type: GraphQLString },
mail: { type: GraphQLString },
password: { type: GraphQLString },
status: {
type: StatusType,
resolve(parentValue, args){
}
},
})
});
const RouteQuery = new GraphQLObjectType({
name: 'RouteQuery',
user: {
type: UserType,
args: { id: { type: GraphQLString } },
resolve(parentValue, args){
//return lodash.find(users, { id: args.id })
}
},
userSome: {
type: new GraphQLList(UserType),
args: { id: { type: GraphQLString } },
resolve(parentValue, args){
if (args.id) {
//return users.filter(user => user.id === args.id);
}
//return users;
}
},
userAll: {
type: new GraphQLList(UserType),
resolve(parentValue){
//return users
}
},
status:{
type: StatusType,
args: { id: { type: GraphQLInt } },
resolve(parentValue, args){
//return lodash.find(status, { id: args.id })
}
},
statusAll: {
type: new GraphQLList(StatusType),
resolve(parentValue){
//return users
}
}
}
});
module.exports = new GraphQLSchema({
query: RouteQuery
})
此代码成功运行,但是当我尝试将它们分成多个文件时: const StatusType & UserType
如下例所示:StatusType 在 StatusType.js 文件上,而 UserType 在 UserType.js 文件上
StatuType.js 文件:
const graphQL = require('graphql');
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;
const UserType = require('./UserType')
const StatusType = new GraphQLObjectType({
name: 'Status',
fields: () => ({
id: { type: GraphQLInt },
statusName: { type: GraphQLString },
user: {
type: new GraphQLList(UserType),
resolve(parentValue, args){
//return users.filter(user => user.status === parentValue.id);
}
}
})
});
module.exports = StatusType;
UserType.js 文件:
const graphQL = require('graphql');
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;
const StatusType = require('./StatusType')
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLString },
username: { type: GraphQLString },
mail: { type: GraphQLString },
password: { type: GraphQLString },
status: {
type: StatusType,
resolve(parentValue, args){
//return lodash.find(status, { id: parentValue.status })
}
},
})
});
module.exports = UserType;
在 Schema.js 文件中,我像这样包含这两个:
const StatusType = require('./StatusType');
const UserType = require('./UserType');
因此,我没有将所有代码放在同一个文件中,而是将 StatusType 和 UserType 放在各自的文件中。
但是当我运行这段代码时,我得到了这个错误:
所以我不知道这里有什么问题:/
但是当我尝试 console.log 时,我得到了User
作为响应:o 就像它在const UserType = require('./UserType')
上的相同代码上一样
您在 nodeJs 处理require
的方式上遇到了问题。 请参阅http://nodejs.org/api/modules.html#modules_cycles了解如何在节点中处理require
。
特别是在您的情况下,当您这样做时:
const StatusType = require('./StatusType');
const UserType = require('./UserType');
const StatusType = require('./StatusType');
StatusType
StatusTypeconst UserType = require('./UserType')
加载UserType
StatusType
但 nodeJs 会阻止这种情况以避免无限循环。 结果,它执行下一行UserType
初始化为new GraphQLObjectType(...)
并将fields
定义为 function。 function 闭包提供了一个尚未初始化的变量StatusType
。 它只是一个空的导出模块{}
您可以验证添加console.log(StatusType);
创建UserType
字段时:
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => {
console.log(StatusType);
return ({
id: { type: GraphQLString },
username: { type: GraphQLString },
mail: { type: GraphQLString },
password: { type: GraphQLString },
status: {
type: StatusType,
resolve(parentValue, args) {
}
},
});
}
});
你会得到:
{} //instead of StatusType
当所有内容都在同一个文件中时,您不会遇到此问题,因为UserType
和StatusType
都在同一个闭包中定义,现在又相互定义。
要解决这个问题,您必须在同一级别上定义UserType
和StatusType
并注入它们。 可以在此处找到如何执行此操作的一个很好的示例。 在你的情况下:
// StatusType.js
const StatusType = (types) => new GraphQLObjectType({
name: 'Status',
fields: () => {
console.log(types.UserType);
return ({
id: { type: GraphQLInt },
statusName: { type: GraphQLString },
user: {
type: new GraphQLList(types.UserType),
resolve(parentValue, args) {
}
}
});
}
});
module.exports = StatusType;
// UserType.js
const UserType = (types) => new GraphQLObjectType({
name: 'User',
fields: () => {
console.log(types.StatusType);
return ({
id: { type: GraphQLString },
username: { type: GraphQLString },
mail: { type: GraphQLString },
password: { type: GraphQLString },
status: {
type: types.StatusType,
resolve(parentValue, args) {
}
},
});
}
});
module.exports = UserType;
// Schema.js
const StatusTypeInject = require('./StatusType');
const UserTypeInject = require('./UserType');
const types = {};
types.StatusType = StatusTypeInject(types);
types.UserType = UserTypeInject(types);
const StatusType = types.StatusType;
const UserType = types.UserType;
您可以在这里进行一些清理,这是我解决这些情况的方法:
[..]
// import GraphQLNonNull from the graphql lib
// In your case, I'd use GraphQLID instead of GraphQLString
userSome: {
type: new GraphQLList(require('../path/to/UserType')),
args: { id: { type: new GraphQLNonNull(GraphQLID) } },
resolve: async (parentValue, args) => {
// No need for the if statement as we'd sure to have an id.
// return await filter users by id.
}
},
[..]
和往常一样,将您的fields
保留为函数: fields: () => ({})
注入解决了这个错误
// StatusType.js const StatusType = (types) => new GraphQLObjectType({ name: 'Status', fields: () => { console.log(types.UserType); return ({ id: { type: GraphQLInt }, statusName: { type: GraphQLString }, user: { type: new GraphQLList(types.UserType), resolve(parentValue, args) { } } }); } }); module.exports = StatusType;
在您的目录中创建一个 types.js 文件。 在这里,您可以添加与其他类型集成的所有类型并注入所需的类型。
const UserTypeInject = require("./UserType"); const StatusTypeInject = require("./Author"); const types = {}; types.UserType = UserTypeInject(types); types.StatusType = StatusTypeInject(types); const UserType = types.UserType; const StatusType = types.StatusType; module.exports = { UserType, StatusType };
每当您需要 Mutations 或 Queries 中的类型时,您都可以从 types.js 文件中导入它;
const { UserType } = require("../types");
https://i.stack.imgur.com/ORvCG.png
请参阅上面的图像和代码行: 5. 我正在使用Mutation GraphQL 将数据插入到我的客户端集合中,并对 ClientType ('ClientType') 使用单引号并得到相同的错误。 我刚刚删除了一个单引号,因为该类型需要客户端 GraphQLObjectType,并且我将 ClientType 作为字符串提供。
我搜索了2天。 希望它会帮助任何人。
您在声明之前在 StatusType 中导入 UserType。
const StatusType = require('./StatusType');
const UserType = require('./UserType');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.