In my leisure time at July and first part of this August 2021, I have tried to use packages of express
, passport
, graphql
, graphql-passport
, join-monster
, knex
, graphql-relay
, and express-session
, etc… for building graphql API server. I have successfully built it in early stage.
In summary for quick, it’s impossible for me to create pagination mechanism using graphql-relay
package automatically. All of I expect to use graphql-relay
and join-monster
packages together is they will do most and rest part of pagination and also they do it automatically. I had tried and found it in vain.
When I want to add pagination mechanism to graphql’s query results, I found join-monster
pagination offical document says it supports three kinds of pagination:
All of them need to do relay-compliant
spec for integrating to join-monster
, that means type of query result must have two fields: pageInfo
and edges
. You can refer it for relay spec. content and examples from graphql server spec. for relay spec..
The process I have tried is use connectionDefinitions()
from graphql-relay
package into model/Query
. This function says it
returns a connectionType and its associated edgeType, given a node type.
And I always receive error message from graphiql interface: must provide fields of pageInfo and edges
.
The excerpted structure of server is:
model/
|
--- Query.js
|
--- User.js
|
--- Program.js
|
--- UserProgramRel.js
// Query has the method: users().
// A user may have many programs and UserProgramRel has relation records between User and Program.
Excerpted Content of model/User.js
:
Notice: This unworks even I add fields of pageInfo
and edges
, which are I following pagination tutorial of join-monster
package.
// skip parts...
const {
forwardConnectionArgs,
connectionDefinitions,
} = require("graphql-relay");
const { connectionType: UserProgramRelConnection } = connectionDefinitions({
nodeType: UserProgramRel,
});
const User = new graphql.GraphQLObjectType({
// skip parts...
fields: () => ({
// skip parts...
hasProgram: {
type: UserProgramRelConnection,
args: forwardConnectionArgs,
extensions: {
joinMonster: {
orderBy: {
created_at: "desc",
},
sqlPaginate: true,
junction: {
sqlTable: "xxx",
sqlJoins: [
(userTable, userProgramRelTable) =>
`${userTable}.id = ${userProgramRelTable}.u_id`,
(userProgramRelTable, programTable) =>
`${userProgramRelTable}.p_id = ${programTable}.id`,
],
},
},
},
},
}),
});