每个数据节点执行单独的数据库请求

时间:2017-02-12 11:45:23

标签: graphql graphql-js

下面是GraphQLObject字段

    userId: {
        type: GraphQLID,
        resolve: obj => {
            console.log(obj._id);
            return obj._id;
        }
    },
    email: { type: GraphQLString },
    password: { type: GraphQLString },
    firstName: { type: GraphQLString },
    lastName: { type: GraphQLString },

我的服务器在我的文档中同样发出多个请求,这里它会发送5个不同的请求。

如何优化这些请求在一个请求中获取所有数据

    589800cf39b58b29c4de90dd
--------------------------------
    58980673e7c9a733009091d1
--------------------------------
    58985339651c4a266848be42
--------------------------------
    589aac5f884b062b979389bc
--------------------------------
    589aad9d24989c2d50f2a25a

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以创建一个query方法,该方法接受array作为参数,在这种情况下,这将是一个ID数组。

getUsers: {
    type: new GraphQLList(User),
    args: {
        ids: {
            type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLID)))
        } 
    },
    resolve: (root, args, context) => {
        let query = 'SELECT * FROM users WHERE id = ANY($1)';

        return pgClient.query(query, [args.ids], (err, result) => {
            // here you would access all returned rows in the result object
            console.log(result);
        });
    }
}

query变量会因您使用的数据库而异。在这个例子中,我使用了PostgreSQL的node-postgres模块。但是,概念是相同的 - 使用id数组来执行返回所有用户的单个查询。

然后你可以调用该查询:

query getUsers($ids: [ID!]!) {
    getUsers(ids: $ids){
        id
        email
        ...
    }
}

// and the variables below
{
    ids: ['id#1', 'id#2', 'id#3']
}

答案 1 :(得分:0)

这是Dataloader的工作,这是一个来自Facebook的图书馆,专门用于将这样的查询批处理:

https://github.com/facebook/dataloader