如何在 returns 分页元数据和数据集的 graphql 中实现分页
How to implement pagination in graphql which returns pagination metadata along with dataset
目前我使用 graphql 默认分页,即使用限制偏移(下面给出的代码)。这工作正常。但是我们如何包含分页元数据而不是团队列表。和 return 分页元数据。我使用 sequalize 来获取数据
type Query {
allTeams(page:Int, pageSize:Int): [Team]
}
type Team {
id: Int
name: String
}
//resolver with pagination
const paginate = ( page, pageSize ) => {
var offset = page * pageSize;
var limit = pageSize;
return {
offset,
limit,
};
};
export const resolvers = {
Query: {
allTeams: async (obj, args, context, info ) => Teams.findAll(
paginate( args.page, args.pageSize ),
),
},
}
以上代码只会 return 团队列表。
有什么方法可以 return 包含团队列表和分页详细信息的输出
{
"data": {
"allTeams": [
{
"id": 4,
"name": "Team created from postman",
},
{
"id": 5,
"name": "Team created from postman",
}
]
},
"pageInfo": {
"currentPage": 2,
"perPage": 2,
"itemCount": 4,
"pageCount": 2,
"hasPreviousPage": true,
"hasNextPage": false
}
}
是的,您只需要将分页元数据添加到架构中并在解析器中提供数据。因此,对于您要实现的输出,架构如下所示:
type Query {
teams(page:Int, pageSize:Int): TeamsConnection
}
type TeamsConnection {
results: [Team]
pageInfo: PageInfo
}
type Team {
id: Int
name: String
}
type PageInfo {
currentPage: Int
perPage: Int
itemCount: Int
pageCount: Int
hasPreviousPage: Boolean
hasNextPage: Boolean
}
您的解析器然后需要 return 响应数据的新形状。所以像:
export const resolvers = {
Query: {
allTeams: async (obj, args, context, info ) => {
const results = awaitTeams.findAll(
paginate(args.page, args.pageSize),
);
return {
results,
pageInfo: {...}
}
}
}
}
目前我使用 graphql 默认分页,即使用限制偏移(下面给出的代码)。这工作正常。但是我们如何包含分页元数据而不是团队列表。和 return 分页元数据。我使用 sequalize 来获取数据
type Query {
allTeams(page:Int, pageSize:Int): [Team]
}
type Team {
id: Int
name: String
}
//resolver with pagination
const paginate = ( page, pageSize ) => {
var offset = page * pageSize;
var limit = pageSize;
return {
offset,
limit,
};
};
export const resolvers = {
Query: {
allTeams: async (obj, args, context, info ) => Teams.findAll(
paginate( args.page, args.pageSize ),
),
},
}
以上代码只会 return 团队列表。 有什么方法可以 return 包含团队列表和分页详细信息的输出
{
"data": {
"allTeams": [
{
"id": 4,
"name": "Team created from postman",
},
{
"id": 5,
"name": "Team created from postman",
}
]
},
"pageInfo": {
"currentPage": 2,
"perPage": 2,
"itemCount": 4,
"pageCount": 2,
"hasPreviousPage": true,
"hasNextPage": false
}
}
是的,您只需要将分页元数据添加到架构中并在解析器中提供数据。因此,对于您要实现的输出,架构如下所示:
type Query {
teams(page:Int, pageSize:Int): TeamsConnection
}
type TeamsConnection {
results: [Team]
pageInfo: PageInfo
}
type Team {
id: Int
name: String
}
type PageInfo {
currentPage: Int
perPage: Int
itemCount: Int
pageCount: Int
hasPreviousPage: Boolean
hasNextPage: Boolean
}
您的解析器然后需要 return 响应数据的新形状。所以像:
export const resolvers = {
Query: {
allTeams: async (obj, args, context, info ) => {
const results = awaitTeams.findAll(
paginate(args.page, args.pageSize),
);
return {
results,
pageInfo: {...}
}
}
}
}