如何解决来自数据加载器的关系数据的 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 举报,一经查实,本站将立刻删除。