使用類和裝飾器創建GraphQL模式和用打字的解析器!
https://typegraphql.com
TypeGraphQL使開發GraphQl 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
}然後,我們可以創建查詢,突變和現場解析器。為此,我們使用類似控制器的類,這些類別按照慣例稱為“解析器”。我們還可以使用依賴注射和驗證後衛等出色功能:
@ 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很棒,並且解決了REST API的許多問題,例如過度提取和不足。但是,在帶有打字稿的Node.js中開發GraphQl API有時會有些痛苦。為什麼?讓我們看一下通常必須採取的步驟。
首先,我們使用SDL在schema.graphql中創建所有GraphQl類型。然後,我們使用代表DB實體的ORM類創建數據模型。然後,我們開始為我們的查詢,突變和字段編寫解析器,但這迫使我們首先為所有參數,輸入甚至對像類型創建TS接口。
只有這樣,我們才能使用怪異的通用簽名和手動執行常見任務,例如驗證,授權和加載依賴項來實現解析器:
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之類的工具僅求解第一部分 - 它們為我們的GraphQl架構生成相應的接口(和解析器骨架),但它們沒有修復模式<->型號<->型號的型號和開發人員的經驗(F2重命名的經驗(F2重命名不起作用),您必須記住,您必須記住codegen在後台上的code gent of Codegen Watch the Backgrouns等,以及常見的效力,授權,授權,等等,等等,等等,等等。
TypeGraphQL根據幾年在打字稿中開發GraphQL API的經驗來解決這些問題。主要的想法是只能通過使用課程定義模式和一些裝飾人員的幫助來擁有一個真理的來源。依賴注入,驗證和AUTH守衛等其他功能通常會幫助我們處理自己的常見任務。
網站上可用文檔,安裝指南和API及其所有功能的詳細說明。
可以在入門文檔時找到一個完整的入門指南(教程)。
如果您喜歡視頻教程,則可以在YouTube上觀看Ben Awad的TypeGraphQL視頻系列。
您還可以在此存儲庫中查看示例文件夾以獲取更多用法示例:簡單字段解析器,DI容器支持,TypeOmm集成,自動驗證等。
測試文件夾還可能會為您提供一些有關如何完成各種工作的提示。
要報告安全漏洞,請使用Tidelift安全聯繫人。 Tidelift將協調修復和披露。
當前發布的版本是穩定的1.0.0版本。它經過良好的測試(97%的覆蓋範圍,約500例測試用例),並且已經實施了大多數計劃的功能。許多公司和獨立開發人員都成功地將其用於生產。
但是,還計劃了更多功能,例如Better Typeorm,Prisma和DataLoader集成,定制裝飾器和元數據註釋支持 - 完整的想法列表可在GitHub Repo上獲得。您還可以跟踪開發委員會在項目委員會上的進步。
如果您有任何有趣的功能請求,請隨時在Github上打開問題,以便我們討論!
TypeGraphQL是MIT許可的開源項目。該框架是大量工作的結果 - 不眠之夜,繁忙的夜晚和周末。
它沒有一家大型公司坐在它的背後 - 只有在社區的支持下,它的持續發展才有可能。
請要求您的公司通過成為金牌贊助商並從我們的核心貢獻者那裡獲得高級技術支持來支持這個開源項目。