Просто изучаю GraphQL, используя как узел, так и c#. Я пытаюсь перенести пример C# на узел, так как это будет хорошим обучающим упражнением (поскольку я не очень хорошо знаю узел или graphql)
У меня есть 2 типа. Учетная запись и владелец (то есть владелец учетной записи)
Все отлично работает со следующими (т.е. поля для собственных учетных записей (список) и первая учетная запись (один объект)
module.exports = new GraphQLObjectType({
name: 'OwnerType',
fields: {
Id: { type: GraphQLID},
Name: {type: GraphQLString},
Address: {type: GraphQLString},
OwnedAccounts: {
type: new GraphQLList(AccountType),
name: "OwnedAccounts",
resolve(obj, args, { mssqlConfig }){
return mssql_account(mssqlConfig).getByOwnerId(obj.Id);
}
},
FirstAccount: {
type: AccountType,
name: "FirstAccount",
resolve(obj, args, {mssqlConfig}){
return mssql_account(mssqlConfig).getFirstByOwnerId(obj.Id);
}
}
}
});
Проблема возникает, когда я пытаюсь добавить поле для AccountOwner в AccountType. Я получаю сообщение об ошибке «В одном из предоставленных типов для построения схемы отсутствует имя».
Я пытался наложить имя на все, что мог видеть, что не помогло вообще.
Оскорбительное определение AccountType:
module.exports = new GraphQLObjectType({
name: 'AccountType',
fields: {
Id: { type: GraphQLID },
Description: { type: GraphQLString },
OwnerId: { type: GraphQLID },
Type: { type: AccountTypeEnum },
AccountOwner: {
type: OwnerType,
resolve(obj, args, { mssqlConfig }){
return mssql_owner(mssqlConfig).get(obj.OwnerId);
}
}
}
});
Если вам нужна дополнительная информация или любой другой код, пожалуйста, дайте мне знать.
РЕДАКТИРОВАТЬ: Если я изменю декларацию двух типов (Аккаунт и Владелец ) и поместите их в тот же файл. js, чтобы он работал (см. ниже). Я также изменил поля, чтобы они возвращали функцию стрелки, которая, по моему мнению, будет задерживать какое-то связывание до тех пор, пока все не будет загружено.
Так что теперь мой вопрос заключается в том, как разделить типы в разных файлах. (JS не моя сильная сторона)
РЕДАКТИРОВАТЬ ... измененные типы ...
const {
GraphQLObjectType,
GraphQLID,
GraphQLString,
GraphQLList
} = require('graphql');
const AccountTypeEnum = require('./accountTypeEnum');
const mssql_owner = require('../../database/mssql/owner');
const mssql_account = require('../../database/mssql/account');
const ownerType = new GraphQLObjectType({
name: 'OwnerType',
fields: () => ({
Id: { type: GraphQLID, name: "Id"},
Name: {type: GraphQLString, Name: "Name"},
Address: {type: GraphQLString},
OwnedAccounts: {
type: new GraphQLList(accountType),
name: "OwnedAccounts",
resolve(obj, args, { mssqlConfig }){
return mssql_account(mssqlConfig).getByOwnerId(obj.Id);
}
},
FirstAccount: {
type: accountType,
name: "FirstAccount",
resolve(obj, args, {mssqlConfig}){
return mssql_account(mssqlConfig).getFirstByOwnerId(obj.Id);
}
}
})
});
const accountType = new GraphQLObjectType({
name: 'AccountType',
fields: () => ({
Id: { type: GraphQLID, name: "Id" },
Description: { type: GraphQLString, name: "Description" },
OwnerId: { type: GraphQLID, name: "OwnerId" },
Type: { type: AccountTypeEnum, name: "Type" },
AccountOwnerFoo: {
name: "Wombat",
type: ownerType,
resolve(parent, args, {mssqlConfig}){
return mssql_owner(mssqlConfig).get(parent.OwnerId);
}
}
})
});
module.exports = {
ownerType,
accountType
}