javascript - GraphQL:为构建模式提供的一种类型缺少名称
问题描述
我正在学习 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 时,const UserType = require('./UserType')
我得到了User
响应:o 就像它在 Schema.js 上的相同代码上一样
解决方案
您在 nodeJs 处理的方式上遇到了问题require
。有关如何在节点中处理,请参阅http://nodejs.org/api/modules.html#modules_cycles 。require
特别是在您的情况下,当您这样做时:
const StatusType = require('./StatusType');
const UserType = require('./UserType');
StatusType
加载自const StatusType = require('./StatusType');
- StatusType.js加载
UserType
自const UserType = require('./UserType')
- UserType.js应该需要
StatusType
,但 nodeJs 会阻止这种情况以避免无限循环。结果,它执行下一行 UserType
被初始化new GraphQLObjectType(...)
并定义fields
为一个函数。函数闭包传递一个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;
推荐阅读
- javascript - 如何在 Ajax 响应表中附加复选框
- swift - SwiftMailgun如何将变量添加到bodyHTML
- typescript - 模块扩充不需要导入?
- phpspreadsheet - 无法在 Phpspreadsheet 中设置单元格值
- python - Django ORM - 获取相关项目的查询集
- docker - Dockerfile 之间的重复
- c++ - Fmod 函数清楚地输出预期的双精度,但 if(fmod == 预期的双精度) 不会评估为真
- javascript - 如何为单独的 webpack 服务器/客户端配置正确覆盖 babel@7 插件
- mysql - 返回主题标签帖子的数量 sql, mysql
- c - 在 C 中,如何获取捕获组 RegEx?