【问题标题】:GraphQL Missing a NameGraphQL 缺少名称
【发布时间】:2020-08-12 12:43:35
【问题描述】:

刚刚使用 node 和 c# 学习 GraphQL。我正在尝试将 C# 示例移植到 node,因为这将是一个很好的学习练习(因为我不太了解 node 或 graphql)

我有两种类型。帐户和所有者(即帐户所有者)

以下所有内容都可以正常工作(即自有帐户(列表)和第一个帐户(单个对象)的字段

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
}

【问题讨论】:

  • 我认为枚举很好。就在我将“AccountOwner”添加到 AccountType 时,我得到了错误。如果我将 AccountOwner 字段设为 GraphQLString 类型,则返回 'foo' 错误就会消失,我可以查询并获取 'foo' OwnerType 有问题。
  • 你试过把name 放在AccountOwner 里面吗?
  • 嗨。不知道你的意思。我能看到的唯一缺少名称的是 OwnerType 上的地址
  • 看来你已经明白了。要深入了解您的问题,您必须了解 Node.js 中用于循环依赖的模块解析算法以及箭头函数如何延迟对象类型的评估。我会尝试将类似的问题链接为重复项

标签: javascript node.js graphql


【解决方案1】:

Node.js 允许循环依赖。并非所有模块系统都允许这样做,但它可以在 Node.js 中使用。问题是,其中一个模块需要在首先解析的任何模块中未定义。在这种情况下,Node.js 分配一个 空对象 作为该模块的导出。

所以基本上你有时会分配一个空对象作为类型 - 因此抱怨该类型缺少 name 属性。好消息是,如果您为其分配属性,对该对象的引用不会改变。你必须做什么我已经回答了herehere

【讨论】:

  • 如果您发现自己想回答一个离题的问题,您可以使用一两个评论,或者您可以将您的答案标记为“社区 wiki”,然后在赏金已过期(我认为不鼓励以非 wiki 身份回答然后关闭,或者至少曾经是)。
  • 我同意有一个灰色区域,但重复项绝对可以关闭。我不知道赏金问题无法关闭的确切原因——也许他们只需要弄清楚退款的机制是什么?不确定,可能是 Meta 的一个!
【解决方案2】:

为什么会出现这个错误?因为您提供的是在编译时未定义的类型。因此,当编译器尝试编译文件时,它会搜索您在此处指定的类型,即AccountType。未编译。这就是为什么 OwnerType 没有得到 AccountType 并且您遇到错误的原因。

简单的解决方案:

您需要在OwnerType 文件中导入AccountType

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

OwenerType 代码之前。这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2020-07-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2018-05-10
    • 2016-01-09
    相关资源
    最近更新 更多