web-dev-qa-db-fra.com

GraphQL n'a pas de nom

Apprendre simplement GraphQL en utilisant à la fois node et c #. J'essaie de porter l'exemple C # sur node car ce sera un bon exercice d'apprentissage (puisque je ne connais pas très bien node ou graphql)

J'ai 2 types. Compte et propriétaire (c'est-à-dire propriétaire du compte)

Tout fonctionne correctement avec les éléments suivants (c'est-à-dire les champs pour les comptes détenus (liste) et le premier compte (objet unique)

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);
            }
        }
    }
}); 

Le problème se pose lorsque j'essaie d'ajouter un champ pour AccountOwner au AccountType. J'obtiens l'erreur "Un des types fournis pour la construction du schéma n'a pas de nom."

J'ai essayé de mettre un nom sur tout ce que je pouvais voir, ce qui n'a pas du tout aidé.

La définition du type de compte incriminé est:

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);
               }
        }
    }
});

Si vous avez besoin de plus d'informations ou de tout autre code, veuillez me le faire savoir.

EDIT: Si je change la déclaration des deux types (Compte et Propriétaire) et les mets dans le même fichier .js, cela fonctionne (voir ci-dessous). J'ai également changé les champs pour renvoyer une fonction de flèche qui, je crois, retardera une sorte de liaison jusqu'à ce que tout soit chargé.

Alors maintenant, ma question est de savoir comment séparer les types en différents fichiers. (JS n'est pas mon point fort)

MODIFIER ... Types modifiés ...

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
}
9
S Rosam

pourquoi cette erreur s'est produite? Parce que vous donnez le type qui n'est pas défini au moment de la compilation. Ainsi, lorsque le compilateur essaie de compiler le fichier, il recherche le type que vous avez spécifié ici, c'est AccountType. qui n'est pas compilé. C'est pourquoi OwnerType n'a pas obtenu le AccountType et vous obtenez une erreur.

Solution simple:

Vous devez importer le AccountType dans le fichier OwnerType.

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

avant le code OwenerType. Cela pourrait être utile.

0
Mayur