来自数据加载器的关系数据的 URQL GraphQL 缓存问题

问题描述

我正在实现光标分页以创建无限滚动的帖子,建立在文档中 URQL 的简单分页示例的基础上。它工作正常,我得到了我想要的帖子所有我想要的信息......直到通过在我的 {{1} 中将 info.partial 设置为 true 使缓存失效} 功能。然后我得到 cursorPagination()

我想知道我是否需要做一些特殊的事情来缓存来自字段解析器(数据加载器)的结果?除了 project: null 之外,我还有其他关系,它们的行为符合预期,因此它必须是该字段解析器特有的……它是唯一可以为空的关系,也许它与该事实有关,但为什么会这样最初返回值,然后在 post.project 设置为 info.partial 时丢失它?

这是我的代码,让我知道是否还有其他我应该分享内容以阐明问题。提前致谢。

createProjectLoader.ts

true

resolvers/post.ts

import DataLoader from "DataLoader";
import { Project } from "../entities/Project";

export const createProjectLoader = () => new DataLoader<number,Project>(async projectIds => {
  const projects = await Project.findByIds(projectIds as number[]);

  const projectIdToProject: Record<number,Project> = {};

  projects.forEach(p => {
    projectIdToProject[p.id] = p;
  });

  return projectIds.map((projectId) => projectIdToProject[projectId])
})

...

@FieldResolver(() => Project,{ nullable: true })
  project(
    @Root() post: Post,@Ctx() { projectLoader }: MyContext
  ) {
    return post.projectId ? projectLoader.load(post.projectId) : undefined
  }

createUrqlClient.ts

@Query(() => PaginatedPosts)
async posts(
  @Arg('limit',() => Int) limit: number,@Arg('cursor',() => String,{ nullable: true }) cursor: string | null,): Promise<PaginatedPosts> {
  const realLimit = Math.min(20,limit);
  const realLimitPlusOne = realLimit + 1;

  const replacements: any[] = [realLimitPlusOne];

  if (cursor) {
    replacements.push(new Date(parseInt(cursor)));
  }

  const posts = await getConnection().query(`
    select p.*
    from post p
    ${cursor ? `where p."createdAt" < $2` : ""}
    order by p."createdAt" DESC
    limit $1
  `,replacements
  )

  return {
    posts: posts.slice(0,realLimit),hasMore: posts.length === realLimitPlusOne
  };
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)