当前位置: 首页 > 知识库问答 >
问题:

如何在现有GraphQL Server上添加根查询和查看器查询以获得中继支持

何嘉运
2023-03-14

我已经使用GraphQL一段时间了,并且能够成功启动一个简单的GraphQL服务器。现在我试图让它支持中继,这是我的最终目标,但我在添加对根节点查询和查看器查询的支持时遇到了麻烦。

我确实理解节点和查看器的概念,但我没有按照我构建代码的方式使其工作。这是我的代码,组织成单独的文件

./graphql/User/types.js

import { 
    GraphQLObjectType, 
    GraphQLInputObjectType,
    GraphQLNonNull,
    GraphQLID,
    GraphQLList,
    GraphQLString, 
    GraphQLInt, 
    GraphQLBoolean 
} from 'graphql';

 import { GraphQLLong } from '../scalars';

 import { NodeInterface } from '../interfaces';

const fields = {
        _id: {
            type: new GraphQLNonNull(GraphQLID)
        },
        email: {
            type: GraphQLString
        },
        firstName: {
            type: GraphQLString
        },
        lastName: {
            type: GraphQLString
        },
        jobTitle: {
            type: GraphQLString
        },
        phone: {
            type: GraphQLString
        }
    };


export const UserType = new GraphQLObjectType({
    name: 'User',
    description: 'User',
    interface: NodeInterface,
    fields: fields
})

./graphql/User/queries.js

import { GraphQLNonNull, GraphQLID, GraphQLList } from 'graphql';

import { UserType, UserInputType } from './types';
import UserModel from '../../models/User';

const User = {
    type: UserType,
    description: 'Get single user',
    args: {
        id: {
            name: 'id',
            type: new GraphQLNonNull(GraphQLID)
        }
    },
    resolve(root, params) {

        params.deleted = false;

        return UserModel.find(params).exec();
    }
}


const Users = {
    type: new GraphQLList(UserType),
    description: 'Get all users',
    resolve(root) {
        const companies = UserModel.find({ deleted: false }).exec();
        if (!companies) {
            throw new Error('Error getting users.')
        }
        return companies;   
    }
}

export default {
    User,
    Users
}

./graphql/company/types.js

import { 
    GraphQLObjectType, 
    GraphQLInputObjectType,
    GraphQLNonNull,
    GraphQLID,
    GraphQLList,
    GraphQLString, 
    GraphQLInt, 
    GraphQLBoolean 
} from 'graphql';

 import { GraphQLLong } from '../scalars';

 import { UserType } from '../User/types';

 import { NodeInterface } from '../interfaces';

 import UserModel from '../../models/User';

 const fields = {
    _id: {
        type: new GraphQLNonNull(GraphQLID)
    },
    name: {
        type: GraphQLString
    },
    ein: {
        type: GraphQLString
    },
    users: {
        type: new GraphQLList(UserType),
        resolve(company) {
            const { _id } = company;
            return UserModel.find({ companyId: _id }).exec();
        }
    }
 };

 export const CompanyType = new GraphQLObjectType({
    name: 'Company',
    description: 'Company',
    interface: NodeInterface,
    fields: fields
 })
 

./FIG ql/公司/queries.js

import { GraphQLNonNull, GraphQLID, GraphQLList } from 'graphql';

import { CompanyType, CompanyInputType } from './types';
import CompanyModel from '../../models/Company';

const Company = {
    type: CompanyType,
    description: 'Get single company',
    args: {
        id: {
            name: 'id',
            type: new GraphQLNonNull(GraphQLID)
        }
    },
    resolve(root, params) {

        params.deleted = false;

        return CompanyModel.find(params).exec();
    }
}


const Companies = {
    type: new GraphQLList(CompanyType),
    description: 'Get all companies',
    resolve(root) {
        const companies = CompanyModel.find({ deleted: false }).exec();
        if (!companies) {
            throw new Error('Error getting companies.')
        }
        return companies;   
    }
}

export default {
    Company,
    Companies
}

./graphql/interfaces.js

import { 
    GraphQLInterfaceType,
    GraphQLNonNull, 
    GraphQLID 
} from 'graphql';


const NodeInterface = new GraphQLInterfaceType({
    name: 'Node',
    fields: {
        id: {
            type: new GraphQLNonNull(GraphQLID)
        }
    },
    resolveType: (source) => {

        return source.__type;
    }
});

export default NodeInterface;

./graphql/schema.js

import { GraphQLObjectType, GraphQLSchema } from 'graphql';
import queries from './queries';
import mutations from './mutations';


export default new GraphQLSchema({
    query: new GraphQLObjectType({
        name: 'Query',
        fields: queries
    }),
    mutation: new GraphQLObjectType({
        name: 'Mutation',
        fields: mutations
    })
});

./graph QL/query . js

import {
    GraphQLObjectType,
    GraphQLNonNull,
    GraphQLID
} from 'graphql';

import { NodeInterface } from './interfaces';
import CompanyQueries from './Company/queries';
import UserQueries from './User/queries';

const RootQuery = new GraphQLObjectType({

    name: 'RootQuery',
    description: 'The root query',
    fields: {
        viewer: {
            type: NodeInterface,
            resolve(source, args, context) {
                return { result: "VIEWER!" };
            }
        },
        node: {
            type: NodeInterface,
            args: {
                id: {
                    type: new GraphQLNonNull(GraphQLID)
                }
            },
            resolve(source, args, context, info) {
                return { result: "NODE QUERY" };
            }
        }
    }
});

export default {
    RootQuery,
    ...CompanyQueries,
    ...UserQueries
}

./server.js

import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import morgan from 'morgan';
import graphqlHTTP from 'express-graphql';

import schema from './graphql/schema';

// set up example server
const app = express();
app.set('port', (process.env.API_PORT || 3001));


// logger
app.use(morgan('dev')); 

// parse body
app.use(bodyParser.json());

app.use('/graphql', graphqlHTTP({
    schema: schema,
    graphiql: true,
    pretty: true
}));

const mongoUri = process.env.MONGO_URI || 'mongodb://localhost/testdb';

mongoose.set('debug', true);

mongoose.connect(mongoUri, {
    useMongoClient: true,
});

export default app;

未将根查询添加到架构中。实际上我收到此错误:

Error: Query.RootQuery field type must be Output Type but got: undefined.

从概念上讲,我不知道如何修复这段代码:

a)我不知道如何将那个RootQuery添加到我的查询中,也不知道我是否需要将我的其他查询保存到我的服务器中(因为Relay基本上依赖于节点查询)。

b)我也看不出我的RootQuery如何发现对象类型并在< code >返回源返回它。_ _类型。我已经添加了这段代码,但是我不知道给定的类型将如何或者在哪里填充这个字段。

虽然我对 GraphQL 有一点了解,但似乎我还没有关于如何构建中继所需的根查询的基础知识(不谈论分页器,但这是我解决这个问题后的下一步)。

共有1个答案

殳勇
2023-03-14

问题似乎是

import queries from './queries';

new GraphQLObjectType({
    name: 'Query',
    fields: queries
}),
const RootQuery = new GraphQLObjectType({
    …
});

export default {
    RootQuery,
    …
};

作为 Query 类型的字段传递的查询是类型的对象,而不是字段配置的对象。它们缺少类型和解析属性,如错误消息所抱怨的那样。

 类似资料:
  • 问题内容: 我如何跟踪Linux服务器上发生的MySQL查询? 例如,我希望设置某种侦听器,然后请求一个网页并查看引擎执行的所有查询,或者仅查看在生产服务器上运行的所有查询。我怎样才能做到这一点? 问题答案: 您可以运行MySQL命令以查看在任何给定时间正在处理哪些查询,但这可能无法实现您所希望的。 获取历史记录而不必使用服务器修改每个应用程序的最佳方法可能是通过触发器。您可以设置触发器,以便每次

  • 我有如下要求。 从UI获取place子句作为字符串,任何选项都可以在Spring Boot中的place子句中添加字符串以查询mongo DB 例如:(eventType以“asdf”和age开头 在sql中,我们可以添加where子句,但不确定如何在mongoDB的springboot中做到这一点 注意:字符串是动态的,没有特定的模式。括号可以嵌套。Spring防尘套前端角度和维修 提前感谢

  • 问题内容: 我在Access 2013的数据库中有一个表。 我希望在它们旁边添加Rowid号: 问题答案: 一种方法是在子查询中使用该函数。不确定它的伸缩性是否合适,可能还有更好的方法…

  • 我使用的是Spring Data JPA 1.7.1 这里有一个例子:

  • 我有2个与数据库表映射的类。 复合主键类: 1 : 加载配置文件 2:前进动力 我想执行查询 我使用JPA标准在java中编写了一个等效的查询 查询 我将选项设置为hibernate.show_sql = true。现在,该查询为我提供了确切的1000个所需结果。当我看到由ORM通过上述代码生成的Hibernate查询时。ORM为能量表创建1个查询,为前功率表创建1000个查询,这会导致性能问题,

  • 如何在下面的本机搜索查询中添加查询超时?