GraphQL 突变中的自定义类型

Posted

技术标签:

【中文标题】GraphQL 突变中的自定义类型【英文标题】:Custom type in GraphQL mutation 【发布时间】:2017-09-18 17:22:48 【问题描述】:

我正在使用GraphQL js。我想在其中实现一对多关联。我有两种类型userOffice。一个用户有很多办公室.

用户类型:

var graphql = require('graphql');
const userType = new graphql.GraphQLObjectType(
name: 'user',
fields :()=>
var officeType=require('./officeSchema');
return 
  _id: 
    type: graphql.GraphQLID
  ,
  name: 
    type: graphql.GraphQLString
  ,
  age: 
    type: graphql.GraphQLString
  ,
  office:
    type:officeType
  
;

 );
module.exports=userType;

officeSchema:

const officeType = new graphql.GraphQLObjectType(
name: 'office',
fields:()=> 
var userType = require('./userSchema');
return 
  _id: 
    type: graphql.GraphQLID
  ,
  room: 
    type: graphql.GraphQLString
  ,
  location: 
    type: graphql.GraphQLString
  ,
  users: 
    type: new graphql.GraphQLList(userType),
    resolve: (obj,_id) => 
     fetch('http://0.0.0.0:8082/office/user/'+obj._id, 
          method: "GET",
          headers: 
            'Content-Type': 'application/json'
          
        )
        .then(function(res) return res); 
  
  
 ;
 
);

现在变异代码如下:

const Adduser = 
type: userType,
args: 
    name: 
        type: graphql.GraphQLString
    ,
    age: 
        type: graphql.GraphQLString
    

,
resolve: (obj, 
    input
) => 


;
const Addoffice = 
type: OfficeType,
args: 
     room: 
            type: graphql.GraphQLString
        ,
        location: 
            type: graphql.GraphQLString
        ,
        users: 
            type: new graphql.GraphQLList(userInputType)
        
,
resolve: (obj, 
    input
) => 


;
const Rootmutation = new graphql.GraphQLObjectType(
name: 'Rootmutation',
fields: 
    Adduser: Adduser,
    Addoffice: Addoffice

);

此代码抛出错误

Rootmutation.Addoffice(users:) 参数类型必须是 Input Type 但得到:[user]。

我想在数据库中添加实际字段以及关联表的字段,但无法解决问题。

更新:

1-新增 GraphQLInputObjectType:

const officeInputType = new graphql.GraphQLInputObjectType(
name: 'officeinput',
fields: () => 
    return 
        room: 
            type: graphql.GraphQLString
        ,
        location: 
            type: graphql.GraphQLString
        
    
 
);
const userInputType = new graphql.GraphQLInputObjectType(
name: 'userinput',
fields: () => 
    return 
        name: 
            type: graphql.GraphQLString
        ,
        age: 
            type: graphql.GraphQLString
        
    
  
);

2-在 AddOffice 中添加了 userinputtype 而不是 usertype。

现在错误是

 Rootmutation.Addoffice(user:) argument type must be Input Type but got: userinput.

【问题讨论】:

【参考方案1】:

问题是您提供了userType 作为Addoffice 突变的参数类型之一。 userType 不能是参数类型。相反,您必须使用输入类型。

有两种对象类型:输出类型和输入类型。您的userTypeofficeType输出 类型。您需要使用GraphQLInputObjectType [docs] 创建一个输入 类型。它可能具有非常相似的字段。您可以将其用作参数字段的类型。

const userInputType = new graphql.GraphQLInputObjectType(
  name: 'UserInput',
  fields () => 
    return 
      _id: 
        type: graphql.GraphQLID
      ,
      // ...
    ;
  
);

【讨论】:

根据您的建议更改了代码。请看看我现在做错了什么?

以上是关于GraphQL 突变中的自定义类型的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL - 突变响应后的自定义错误消息

具有自定义标量类型的 GraphQL.js 突变

Flutter / GraphQL - 以自定义类型为参数的突变

Graphql-java 中的自定义标量

如何在 apollo 的 graphql-gql 中使用从 npm 包导入的自定义 graphQL 类型

如何在graphQl中制作具有确定值的自定义类型