Graphql 图Ql:来自阵列芯片的继电器连接
没有任何文档说明如何使用facebook的graphql relay js helper库实现数组元信息(arrayLength和sliceStart) 我使用以下实现成功地实现了它,但是我猜有一种更简单/更正确的方法来实现 从数据库中检索行和行数Graphql 图Ql:来自阵列芯片的继电器连接,graphql,apollo,graphql-relay,Graphql,Apollo,Graphql Relay,没有任何文档说明如何使用facebook的graphql relay js helper库实现数组元信息(arrayLength和sliceStart) 我使用以下实现成功地实现了它,但是我猜有一种更简单/更正确的方法来实现 从数据库中检索行和行数 function transformRole(role: Role) { return { ...role, roleId: role.id }; } async function getRolesSlice({ roleId, afte
function transformRole(role: Role) {
return { ...role, roleId: role.id };
}
async function getRolesSlice({ roleId, after, first, last, before }: any): Promise<[Role[], number]> {
const queryBuilder = repository.createQueryBuilder();
if (roleId !== undefined) {
queryBuilder.where('id = :roleId', { roleId });
}
if (before) {
const beforeId = cursorToOffset(before);
queryBuilder.where('id < :id', { id: beforeId });
}
if (after) {
const afterId = cursorToOffset(after);
queryBuilder.where({
id: MoreThan(Number(afterId))
});
}
if (first === undefined && last === undefined) {
queryBuilder.orderBy('id', 'ASC');
}
if (first) {
queryBuilder.orderBy('id', 'ASC').limit(first);
}
if (last) {
queryBuilder.orderBy('id', 'DESC').limit(last);
}
return Promise.all([
queryBuilder.getMany()
.then(roles => roles.map(transformRole)),
repository.count() // Total number of roles
]);
}
编辑:
这是我想出的,它是一个小清洁,似乎是正确的工作
const initialize = () => {
repository = getConnection().getRepository(Role);
}
function transformRole(role: Role) {
return { ...role, roleId: role.id };
}
function getRolesSlice(args: any):
Promise<[
Role[],
any,
{ arrayLength: number; sliceStart: number; }
]> {
if (!repository) initialize();
const { roleId, after, first, last, before } = args;
const queryBuilder = repository.createQueryBuilder();
if (roleId !== undefined) {
queryBuilder.where('id = :roleId', { roleId });
}
if (before !== undefined) {
const beforeId = cursorToOffset(before);
queryBuilder.where({
id: LessThan(beforeId)
});
}
if (after !== undefined) {
const afterId = cursorToOffset(after);
queryBuilder.where({
id: MoreThan(Number(afterId))
});
}
if (first !== undefined) {
queryBuilder.orderBy('id', 'ASC').limit(first);
} else if (last !== undefined) {
queryBuilder.orderBy('id', 'DESC').limit(last);
} else {
queryBuilder.orderBy('id', 'ASC');
}
return Promise.all([
queryBuilder.getMany()
.then(roles => roles.map(transformRole))
.then(roles => last !== undefined ? roles.slice().reverse() : roles),
repository.count()
]).then(([roles, totalCount]) =>
[
roles,
args,
{
arrayLength: totalCount + 1,
sliceStart: roles[0] && roles[0].roleId
}
]
);
}
// Resolver
roles: {
type: rolesConnection,
args: {
...connectionArgs,
roleId: {
type: GraphQLString
}
},
resolve: (_, args) =>
getRolesSlice(args)
.then((slice) => connectionFromArraySlice(...slice))
},
const initialize=()=>{
repository=getConnection().getRepository(角色);
}
功能转换角色(角色:角色){
返回{…角色,roleId:role.id};
}
函数getRolesSlice(参数:任意):
允诺{
如果(!repository)初始化();
const{roleId,after,first,last,before}=args;
const queryBuilder=repository.createQueryBuilder();
if(roleId!==未定义){
其中('id=:roleId',{roleId});
}
如果(之前!==未定义){
const beforeId=光标偏移量(之前);
queryBuilder.where({
id:LessThan(以前的id)
});
}
如果(之后!==未定义){
常量afterId=游标偏移量(之后);
queryBuilder.where({
id:超过(编号(afterId))
});
}
如果(第一个!==未定义){
queryBuilder.orderBy('id','ASC').limit(第一);
}else if(last!==未定义){
queryBuilder.orderBy('id','DESC').limit(last);
}否则{
orderBy('id','ASC');
}
回报你的承诺([
queryBuilder.getMany()
.then(角色=>roles.map(转换角色))
.然后(角色=>last!==未定义的角色.slice().reverse():角色),
repository.count()
])。然后(([roles,totalCount])=>
[
角色,
args,
{
阵列长度:总计数+1,
sliceStart:角色[0]&角色[0]。角色ID
}
]
);
}
//分解器
角色:{
类型:角色连接,
args:{
…连接args,
罗莱德:{
类型:GraphQLString
}
},
解析:(\uz,args)=>
getRolesSlice(args)
.然后((切片)=>connectionFromArraySlice(…切片))
},
const initialize = () => {
repository = getConnection().getRepository(Role);
}
function transformRole(role: Role) {
return { ...role, roleId: role.id };
}
function getRolesSlice(args: any):
Promise<[
Role[],
any,
{ arrayLength: number; sliceStart: number; }
]> {
if (!repository) initialize();
const { roleId, after, first, last, before } = args;
const queryBuilder = repository.createQueryBuilder();
if (roleId !== undefined) {
queryBuilder.where('id = :roleId', { roleId });
}
if (before !== undefined) {
const beforeId = cursorToOffset(before);
queryBuilder.where({
id: LessThan(beforeId)
});
}
if (after !== undefined) {
const afterId = cursorToOffset(after);
queryBuilder.where({
id: MoreThan(Number(afterId))
});
}
if (first !== undefined) {
queryBuilder.orderBy('id', 'ASC').limit(first);
} else if (last !== undefined) {
queryBuilder.orderBy('id', 'DESC').limit(last);
} else {
queryBuilder.orderBy('id', 'ASC');
}
return Promise.all([
queryBuilder.getMany()
.then(roles => roles.map(transformRole))
.then(roles => last !== undefined ? roles.slice().reverse() : roles),
repository.count()
]).then(([roles, totalCount]) =>
[
roles,
args,
{
arrayLength: totalCount + 1,
sliceStart: roles[0] && roles[0].roleId
}
]
);
}
// Resolver
roles: {
type: rolesConnection,
args: {
...connectionArgs,
roleId: {
type: GraphQLString
}
},
resolve: (_, args) =>
getRolesSlice(args)
.then((slice) => connectionFromArraySlice(...slice))
},