web-dev-qa-db-ja.com

名前がないGraphQL

ノードとc#の両方を使用してGraphQLを学習するだけです。 C#の例をノードに移植しようとしています。これは良い学習の練習になるためです(ノードやグラフをよく知らないため)。

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に追加しようとすると発生します。 「スキーマを構築するために提供されたタイプの1つに名前がありません」というエラーが表示されます。

私は見ることができたすべてに名前を付けようとしましたが、それはまったく役に立ちませんでした。

問題のある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);
               }
        }
    }
});

さらに詳しい情報やその他のコードが必要な場合はお知らせください。

編集:2つのタイプ(アカウントと所有者)の宣言を変更し、それらを同じ.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
}
9
S Rosam

なぜこのエラーが発生したのですか?コンパイル時に定義されていない型を与えているからです。したがって、コンパイラがファイルをコンパイルしようとすると、ここで指定したタイプAccountTypeが検索されます。コンパイルされていません。そのため、OwnerTypeAccountTypeを取得せず、エラーが発生します。

簡単な解決策:

AccountTypeファイル内にOwnerTypeをインポートする必要があります。

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

OwenerTypeコードの前。これは役に立ちます。

0
Mayur