GraphQL отсутствует имя - PullRequest
       2

GraphQL отсутствует имя

8 голосов
/ 28 апреля 2020

Просто изучаю 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
}

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Node.js допускает циклические зависимости. Не все модульные системы позволяют это, но это работает в узле. Проблема в том, что один из модулей должен быть неопределенным в любом модуле, который анализируется первым. В этом случае Node.js назначает пустой объект в качестве экспорта этого модуля.

Так что в основном вы иногда назначаете пустой объект как тип - таким образом, жалуясь на то, что тип отсутствует имя свойства. Однако хорошо, что ссылка на этот объект не изменится, если вы назначите ему свойства. Что вы должны сделать, я уже ответил здесь и здесь .

0 голосов
/ 08 мая 2020

почему произошла эта ошибка? Потому что вы даете тип, который не определен во время компиляции. Таким образом, когда компилятор пытается скомпилировать файл, он ищет тип, который вы здесь указали, это AccountType. который не скомпилирован. Вот почему OwnerType не получил AccountType, и вы получаете сообщение об ошибке.

Простое решение:

Вам необходимо импортировать AccountType в файл OwnerType .

const AccountType = require('./AccountType.js');

до кода OwenerType. Это может быть полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...