클래스와 데코레이터를 사용하여 TypeScript를 사용하여 GraphQL 스키마 및 Resolvers를 만듭니다!
https://typegraphql.com
apsgraphql은 클래스와 약간의 데코레이터 매직을 사용하여 스키마를 정의하여 그래프 QL API를 개발하는 것이 즐거운 프로세스입니다.
따라서 객체 유형 또는 입력 유형과 같은 유형을 만들려면 일종의 DTO 클래스를 사용합니다. 예를 들어, Recipe 유형을 선언하려면 단순히 클래스를 생성하고 데코레이터로 주석을 달 수 있습니다.
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}SDL에서 스키마의 해당 부분을 얻습니다.
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}그런 다음 쿼리, 돌연변이 및 현장 분야를 만들 수 있습니다. 이를 위해 컨벤션에 의해 "Resolvers"라고하는 컨트롤러와 같은 클래스를 사용합니다. 또한 종속성 주입 및 인증 경비원과 같은 멋진 기능을 사용할 수 있습니다.
@ Resolver ( Recipe )
class RecipeResolver {
// dependency injection
constructor ( private recipeService : RecipeService ) { }
@ Query ( returns => [ Recipe ] )
recipes ( ) {
return this . recipeService . findAll ( ) ;
}
@ Mutation ( )
@ Authorized ( Roles . Admin ) // auth guard
removeRecipe ( @ Arg ( "id" ) id : string ) : boolean {
return this . recipeService . removeById ( id ) ;
}
@ FieldResolver ( )
averageRating ( @ Root ( ) recipe : Recipe ) {
return recipe . ratings . reduce ( ( a , b ) => a + b , 0 ) / recipe . ratings . length ;
}
}그리고이 간단한 방식으로, 우리는 SDL에서 스키마 의이 부분을 얻습니다.
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}우리는 모두 GraphQL이 훌륭하다는 것을 알고 있으며, 과도한 API와 같은 REST API와 같은 많은 문제를 해결합니다. 그러나 TypeScript가있는 node.js에서 GraphQL API를 개발하는 것은 때때로 약간의 고통입니다. 왜? 우리가 일반적으로 취해야 할 단계를 살펴 보겠습니다.
먼저 sdl을 사용하여 schema.graphql 에서 모든 GraphQL 유형을 만듭니다. 그런 다음 DB 엔티티를 나타내는 ORM 클래스를 사용하여 데이터 모델을 만듭니다. 그런 다음 쿼리, 돌연변이 및 필드에 대한 Resolvers를 작성하기 시작하지만 먼저 모든 인수, 입력 및 객체 유형에 대한 TS 인터페이스를 생성해야합니다.
그런 다음에만 이상한 일반 서명을 사용하여 Resolvers를 구현하고 검증, 승인 및 로딩 종속성과 같은 일반적인 작업을 수동으로 수행 할 수 있습니다.
export const getRecipesResolver : GraphQLFieldResolver < void , Context , GetRecipesArgs > = async (
_ ,
args ,
ctx ,
) => {
// common tasks repeatable for almost every resolver
const repository = TypeORM . getRepository ( Recipe ) ;
const auth = Container . get ( AuthService ) ;
await joi . validate ( getRecipesSchema , args ) ;
if ( ! auth . check ( ctx . user ) ) {
throw new NotAuthorizedError ( ) ;
}
// our business logic, e.g.:
return repository . find ( { skip : args . offset , take : args . limit } ) ;
} ;가장 큰 문제는 코드베이스의 중복성이므로 물건을 동기화하기가 어렵습니다. 엔티티에 새로운 필드를 추가하려면 모든 파일을 뛰어 넘어야합니다 - 엔티티 클래스, 스키마 및 인터페이스를 수정하십시오. 입력이나 인수도 마찬가지입니다. 한 조각을 업데이트하거나 단일 유형으로 실수하는 것을 잊기 쉽습니다. 또한 필드 이름으로 오타를 만들면 어떻게해야합니까? 이름 변경 기능 (F2)은 올바르게 작동하지 않습니다.
GraphQL 코드 생성기 또는 GraphQLGEN과 같은 도구는 첫 번째 부분 만 해결합니다. 그래프 QL 스키마에 해당하는 인터페이스 (및 Resolvers 골격)를 생성하지만 스키마 <-> 모델 중복성 및 개발자 경험을 수정하지는 않습니다 (F2의 이름을 바꾸지 않으면 코드 겐 시계 작업 등을 기억해야합니다.
TaperGraphQL은 TypeScript에서 GraphQL API를 개발 한 경험을 바탕으로 이러한 문제를 해결하기 위해 제공됩니다. 주요 아이디어는 클래스를 사용하여 스키마를 정의하고 데코레이터의 도움을 사용하여 스키마를 정의함으로써 진실의 하나의 출처를 갖는 것입니다. 의존성 주입, 검증 및 인증 경비원과 같은 추가 기능은 일반적으로 우리 자신을 처리 해야하는 일반적인 작업을 도와줍니다.
API 및 모든 기능에 대한 설명서, 설치 안내서 및 자세한 설명은 웹 사이트에서 제공됩니다.
간단한 연습 (튜토리얼)이있는 전체 시작 가이드는 시작 문서를 얻을 때 찾을 수 있습니다.
비디오 튜토리얼을 선호하는 경우 YouTube에서 Ben Awad의 apsgraphql 비디오 시리즈를 볼 수 있습니다.
이 저장소의 예제 폴더를 확인할 수도 있습니다. 더 많은 사용 예제 : 간단한 필드 리졸버, DI 컨테이너 지원, Typeorm 통합, 자동 유효성 검사 등.
테스트 폴더는 다양한 작업을 수행하는 방법에 대한 몇 가지 팁을 제공 할 수도 있습니다.
보안 취약점을보고하려면 TideLift 보안 연락처를 사용하십시오. Tidelift는 수정 및 공개를 조정합니다.
현재 출시 된 버전은 안정적인 1.0.0 릴리스입니다. 잘 테스트를 거쳤으며 (97% 적용 범위, ~ 500 테스트 사례) 대부분의 계획된 기능이 이미 구현되어 있습니다. 많은 회사와 독립 개발자가 성공적으로 생산에이를 사용하고 있습니다.
그러나 Better Typeorm, Prisma 및 Dataloader 통합, 사용자 정의 데코레이터 및 메타 데이터 주석 지원과 같은 더 많은 기능에 대한 계획도 있습니다. 전체 아이디어 목록은 Github Repo에서 사용할 수 있습니다. 프로젝트 보드에서 개발의 진행 상황을 추적 할 수도 있습니다.
흥미로운 기능 요청이 있다면 Github에서 문제를 열어 주시면 논의 할 수 있습니다!
apsgraphql 은 MIT 라이센스 오픈 소스 프로젝트입니다. 이 프레임 워크는 잠들지 않는 밤, 바쁜 저녁 및 주말 등 엄청난 양의 일의 결과입니다.
그것은 그 뒤에있는 대기업이 없습니다. 커뮤니티의 지원 덕분에 지속적인 개발이 가능합니다.
금 스폰서가되고 핵심 기고자로부터 프리미엄 기술 지원을 받아이 오픈 소스 프로젝트를 지원하도록 회사에 요청하십시오.