Apollo Server+Nexus+Prism에서 GraphiQL 개발: Relay 2 따르기
11965 단어 GraphQLTypeScriptPrismaNexustech
Recruit 표시
주식회사 토리토리토리는 엔지니어를 모집 중이다.
관심 있는 사람은 반드시 나의 트위터에 투고하세요!서로 기준치가 생기다.
종지
저번 보도에서는 Nexus에서 Relay의 GUID/노드를 따르는 방법에 대해 설명합니다.
이번 기사에서는 릴레이의 페이지에 대해 해설을 하고자 합니다.
술 많이 마셔서 힘들어요. 오늘은 간단하게...
Relay의 호출
Relay의 페이지 나누기 시스템에는 다음 매개변수가 있습니다.
first
after
last
before
first
와 after
는 "after
에서 지정한 ID의 노드의 다음 노드에서 first
지정된 수량의 노드로 되돌아온다"는 뜻이다.또한
last
및before
는 "before
에서 지정한 ID의 노드 이전 노드에서 반환last
된 수량의 노드(앞으로)"를 의미합니다.실용적으로
last
와before
가 무엇에 쓰이는지 잘 모르겠어요(때로는 앞쪽으로 붙이고 싶어요)관례대로 하는 것 같으니 실현해야 한다.prisma-relay-cursor-connection
세계에prisma-relay-cursor-connection이라는 프로그램 라이브러리가 있습니다. 이 라이브러리는Presma로 Relay를 붙여넣은 것입니다. 이용하세요.
npm i @devoxa/prisma-relay-cursor-connection
설치.또한relay의 접착을 실현하기 위해 다음과 같은 편집
src/schema.ts
을 했습니다.src/schema.ts
plugins: {
connectionPlugin({
extenedConnection: {
totalCount: { type: 'Int', requireResolver: false },
}
})
}
여기에 한 열totalCount
을 추가했습니다.이것은 페이지를 나누는 것을 고려하지 않고 모든 노드의 수를 되돌려 주는 열입니다.
Query에 prisma-relay-cursor-connection 적용
앞의 두 글에서 소개한 포스트의Query는prisma-relay-cursor-connection을 적용한다.
src/query/post.ts
export const searchPosts = extendType({
type: 'Query',
definition(t) {
t.connectionField('posts', {
type: 'Post',
additionalArgs: {
search: stringArg({ nullable: true }),
},
resolve(_root, args, ctx){
const baseArgs = {
where: {
OR: [
{ title_contains: args.search },
{ content_contains: args.search },
],
},
};
return findManyCursorConnection<Campaign, {databaseId: bigint}>(
(_args) => ctx.prisma.post.findMany({..._args, ...baseArgs}),
() => ctx.prisma.post.count(baseArgs),
{ ...args },
{
getCursor: (record) => ({ databaseId: record.databaseId }),
encodeCursor: (cursor) => Buffer.from('Post:' + cursor.databaseId).toString('base64'),
decodeCursor: (cursor) => ({databaseId: Buffer.from(cursor, 'base64').toString().split(':')[1]}),
}
)
}
})
}
})
복잡하지만 다음과 같은 느낌이 든다.where
또는 orderBy
.주의점
위에서 말한 바와 같이 붙여넣기는 잘 가능하지만, 실제 발매되는 SQL은 확인해보는 게 좋다.
특히
orderBy
를 index가 아닌 열로 지정하면 속도 면에서 불안할 수 있다.앞의 두 문장에서 지정한 SQL을 표준 출력으로 출력합니다:.
src/context.ts
prisma.$on('query', (e) => {
console.log(e)
})
뭐가 그리 좋으냐
솔직히 서버 쪽은 잘 모르지만 이걸 따른다면 아폴로 클라이언트와 릴레이가 클라이언트 쪽에서 잘 할 수 있을 거예요.
질의는 물론, 객체의 Resolver에도 많은 양의 데이터가 반환될 위험이 있는 경우 페이지를 만듭니다.
끝말
오늘은 너무 짧아서 죄송합니다. 제가 스티커를 설명해 드렸어요.
다음에는 발리 데이 등 다른 요소를 설명한다.
Reference
이 문제에 관하여(Apollo Server+Nexus+Prism에서 GraphiQL 개발: Relay 2 따르기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ikazuchi/articles/211204_graphql_nexus_5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)