[英]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.