如何使用GraphQL和node实现接口

How to implement interface using GraphQL and node

我想在另一种对象类型中实现一种对象类型的字段

这是我的架构文件。

const Films = new GraphQLInterfaceType({
  name: 'films',
  fields: () => ({
    id:{
        type: GraphQLID
      },
      name: {
        type: GraphQLString,
      },
    })
})

const MovieStream = new GraphQLObjectType({
    name: 'MovieStream',
    interfaces: () => [Films], 
    fields: () => ({
        id: {
            type: GraphQLID,    
          },    
          movie_id: {
              type: GraphQLString,   
            },    
    })
})

这里我尝试使用界面。但它显示错误:

{
  "errors": [
    {
      "message": "Query root type must be Object type, it cannot be { __validationErrors: undefined, __allowedLegacyNames: [], _queryType: undefined, _mutationType: undefined, _subscriptionType: undefined, _directives: [@include, @skip, @deprecated], astNode: undefined, extensionASTNodes: undefined, _typeMap: { __Schema: __Schema, __Type: __Type, __TypeKind: __TypeKind, String: String, Boolean: Boolean, __Field: __Field, __InputValue: __InputValue, __EnumValue: __EnumValue, __Directive: __Directive, __DirectiveLocation: __DirectiveLocation, films: films, ID: ID, Date: Date, JSON: JSON, MovieStream: MovieStream }, _possibleTypeMap: {}, _implementations: { films: [] } }."
    },
    {
      "message": "Expected GraphQL named type but got: { __validationErrors: undefined, __allowedLegacyNames: [], _queryType: undefined, _mutationType: undefined, _subscriptionType: undefined, _directives: [@include, @skip, @deprecated], astNode: undefined, extensionASTNodes: undefined, _typeMap: { __Schema: __Schema, __Type: __Type, __TypeKind: __TypeKind, String: String, Boolean: Boolean, __Field: __Field, __InputValue: __InputValue, __EnumValue: __EnumValue, __Directive: __Directive, __DirectiveLocation: __DirectiveLocation, films: films, ID: ID, Date: Date, JSON: JSON, MovieStream: MovieStream }, _possibleTypeMap: {}, _implementations: { films: [] } }."
    }
  ]
}

这是查询类型:

const QueryRoot = new GraphQLObjectType({

  name: 'Query',
  fields: () => ({
        getContentList:{
        type: new GraphQLList(contentCategory),
        args: {
          id: {
            type: GraphQLInt
          },
          permalink: {
              type: GraphQLString
          },
          language: {
              type: GraphQLString
          },
          content_types_id: {
              type: GraphQLString
          },
          oauth_token:{
              type: GraphQLString
          }

        },

        resolve: (parent, args, context, resolveInfo) => {
           var category_flag = 0;
           var menuItemInfo = '';
           user_id = args.user_id ? args.user_id : 0;
          // console.log("context"+context['oauth_token']);
           return AuthDb.models.oauth_registration.findAll({attributes: ['oauth_token', 'studio_id'],where:{
              //  oauth_token:context['oauth_token'],
               $or: [
                  {
                      oauth_token: 
                      {
                          $eq: context['oauth_token']
                      }
                  },

                  {
                      oauth_token: 
                      {
                          $eq: args.oauth_token
                      }
                  },
              ]

              },limit:1}).then(oauth_registration => { 
              var oauthRegistration = oauth_registration[0]
              // for(var i = 0;i<=oauth_registration.ength;i++){
                      if(oauth_registration && oauthRegistration && oauthRegistration.oauth_token == context['oauth_token'] || oauthRegistration.oauth_token == args.oauth_token){
                         studio_id = oauthRegistration.studio_id;
                         return joinMonster.default(resolveInfo,{}, sql => {
                            return contentCategoryDb.query(sql).then(function(result) { 

                                return result[0];
                            });   
                        } ,{dialect: 'mysql'});

                      }else{
                          throw new Error('Invalid OAuth Token');
                      }

                  })

        },

        where: (filmTable, args, context) => {
            return getLanguage_id(args.language).then(language_id=>{
                return ` ${filmTable}.permalink = "${args.permalink}" and ${filmTable}.studio_id = "${studio_id}" and (${filmTable}.language_id = "${language_id}"  OR  ${filmTable}.parent_id = 0 AND ${filmTable}.id NOT IN (SELECT ${filmTable}.parent_id FROM content_category WHERE ${filmTable}.permalink = "${args.permalink}" and ${filmTable}.language_id = "${language_id}" and ${filmTable}.studio_id = "${studio_id}"))`
            })

              },

    }

  })
})

module.exports = new GraphQLSchema({
    query: QueryRoot
})

请帮帮我。我是不是在界面的使用上做错了什么?

我通过这个找到了答案post Is it possible to fetch data from multiple tables using GraphQLList

任何人请告诉我在我的代码中使用接口的确切方法。

尽管您打印的错误与 interfaces 实现没有真正相关,但为了使用接口,您必须实现 methods/types 接口引用。因此,在您的情况下,您的对象 MovieStream 缺少您在对象 Films 中引用的类型 name

您的代码应该类似于:

const Films = new GraphQLInterfaceType({
    name: 'films',
    fields: () => ({
        id:{
            type: GraphQLID
        },
        name: {
            type: GraphQLString,

        },
    })
})

const MovieStream = new GraphQLObjectType({
    name: 'MovieStream',
    interfaces: () => [Films],
    fields: () => ({
        id: {
            type: GraphQLID,
        },
        name: {
            type: GraphQLString // You're missing this!
        },
        movie_id: {
            type: GraphQLString,
        },
    })
})

现在回到你打印的错误"message": "Query root type must be Object type, it cannot be...

这好像和你的QueryRoot对象有关,好像GraphQLSchema没有识别根对象。如果修复界面后此问题仍然存在,请查看此答案