[{"data":1,"prerenderedAt":521},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fwhat-is-nestjs":3},{"id":4,"title":5,"body":6,"category":509,"created by":510,"date":511,"description":19,"extension":512,"meta":513,"navigation":514,"path":515,"sections":516,"seo":517,"stem":518,"thumbnail":519,"__hash__":520},"content_ja\u002Fja\u002Fnews\u002Fwhat-is-nestjs.md","NODEJS用バックエンドフレームワークのNESTJS",{"type":7,"value":8,"toc":499},"minimark",[9,16,20,33,36,39,53,56,60,73,91,101,104,110,113,116,124,127,133,141,147,158,164,170,173,179,185,190,196,202,208,212,219,232,238,244,250,256,266,272,278,284,287,293,303,309,317,320,329,335,345,348,351,357,360,363,380,383,391,396,399,404,433,438,452,457,463,469,475,481,487,493],[10,11,13],"h2",{"id":12},"はじめに",[14,15,12],"strong",{},[17,18,19],"p",{},"Nest（NestJSともいう）とは、Node.jsを用いてサーバーサイドのアプリケーションを拡張可能かつ効果的に開発するために使われるフレームワークです。純粋なJavascriptとTypescriptを使ったものであり、以下の要素を組み合わせます。",[21,22,24,27,30],"div",{"style":23},"margin-left: 20px;",[17,25,26],{},"1. OOP（オブジェクト指向プログラミング）",[17,28,29],{},"2. FP（関数型プログラミング）",[17,31,32],{},"3. FRP（関数型リアクティブプログラミング）",[17,34,35],{},"NodeJSには様々なフレームワークがありますが、なぜNestJSを選んだ方が良いでしょうか。 GitHubの統計によると、2020年7月現在、GitHubでNestJSのお気に入り数が28,000を超えています。Web開発プログラミング言語として知られるJavaScriptが発展することにより、色々なJavascript、Nodejsのフレームワークが誕生しました。その中、NestJSがあります。NestJSも例外ではなく、バックエンド側のアプリケーションやRESTful APIを効果的かつ安易に作成することができます。",[17,37,38],{},"以下のstateofjs.comの2019年の調査結果どおりに、頻繁に使われているJavascriptのフレームワークについては、Express、Next.js、Koa、Meteor、Sails、Feathers、Nuxt、Gatsbyといった現在一番人気のあるフレームワークの他に、Nestはますます使われるフレームワークの一つでもあり、他のものよりトップになっています。",[17,40,41,50],{},[42,43],"img",{"className":44,"alt":47,"src":48,"style":49},[45,46],"block","mx-auto","","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F07\u002F28164620\u002Fchart_nestjs.png","width: 100%;",[51,52],"br",{},[17,54,55],{},"Credit: stateofjs.com",[10,57,59],{"id":58},"インストールおよび新たなnestjsアプリ作成","インストールおよび新たなNestJSアプリ作成",[17,61,62,63,72],{},"既に",[64,65,69],"a",{"href":66,"rel":67},"https:\u002F\u002Fnodejs.org\u002Fen\u002F",[68],"nofollow",[14,70,71],{},"Node.js","（10.13.0以上）がインストールされたことを確認しておいてください。",[17,74,75,90],{},[14,76,77,82,85],{},[64,78,81],{"href":79,"rel":80},"https:\u002F\u002Fdocs.nestjs.com\u002Fcli\u002Foverview",[68],"Nest CLI",[14,83,84],{},"では、簡単に新たなプロジェクトを設定することができます。インストールしておいた",[64,86,89],{"href":87,"rel":88},"https:\u002F\u002Fwww.npmjs.com\u002F",[68],"npm"," をもっては、新たなプロジェクトを次のコマンドを実施して作成することができます。",[92,93,98],"pre",{"className":94,"code":96,"language":97},[95],"language-text","$ npm i -g @nestjs\u002Fcli\n","text",[99,100,96],"code",{"__ignoreMap":47},[17,102,103],{},"nestjs-cliインストール",[92,105,108],{"className":106,"code":107,"language":97},[95],"$ nest new project-name\n",[99,109,107],{"__ignoreMap":47},[17,111,112],{},"新たなプロジェクト作成",[17,114,115],{},"上記のコマンドを実行したら、プロジェクトのディレクトリが生成され、NODEモジュールのライブラリやサンプルファイルがインストールされます。",[17,117,118,122],{},[42,119],{"className":120,"alt":47,"src":121,"style":49},[45,46],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F07\u002F28095425\u002Fsource_tree_nestjs-3-1024x276.png",[51,123],{},[17,125,126],{},"プログラムを実行するために次のコマンドを使ってください。",[92,128,131],{"className":129,"code":130,"language":97},[95],"npm start\n",[99,132,130],{"__ignoreMap":47},[17,134,135,136,140],{},"その後、ブラウザにて ",[64,137,138],{"href":138,"rel":139},"http:\u002F\u002Flocalhost:3000",[68],"にアクセスしたら、作成したアプリケーションが動いているのを確認できます。",[10,142,144],{"id":143},"構成およびexpressjsとfastifyの切替",[14,145,146],{},"構成およびExpressJSとFastifyの切替",[17,148,149,150,153,154,157],{},"NestJSがサポートできるHTTPプラットフォームが二つあります。",[14,151,152],{},"Express","と",[14,155,156],{},"Fastify","です。",[17,159,160,163],{},[14,161,162],{},"Express："," Nodejsを使ったWeb開発コミュニティにおいて非常に人気があります。ExpressはNodeJS向けの、有名で簡単なWebフレームワークです。",[17,165,166,169],{},[14,167,168],{},"Fastify："," パフォーマンス面でより良いです。最大限の速度と生産性を提供することをコアとして高パフォーマンスで低コストのあるフレームワークです。",[17,171,172],{},"必要に応じて一つ選択してください。",[17,174,175,176,178],{},"デフォルトとしては、Nestは",[14,177,152],{},"フレームワークを使います。",[92,180,183],{"className":181,"code":182,"language":97},[95],"import '.\u002FLoadEnv';\nimport { NestFactory } from '@nestjs\u002Fcore';\nimport { AppModule } from '.\u002Fapp.module';\nimport { ValidationPipe } from '@nestjs\u002Fcommon';\nasync function bootstrap() {\n  try {\n    const app = await NestFactory.create(AppModule);\n    app.useGlobalPipes(new ValidationPipe());\n    await app.listen(process.env.PORT || 3000);\n  } catch (err) {\n    console.log(err);\n  }\n}\nbootstrap();\n",[99,184,182],{"__ignoreMap":47},[17,186,187,189],{},[14,188,156],{},"を使ってNestJSを構成するため、最初に必要となるパッケージをインストールしておくべきです。",[92,191,194],{"className":192,"code":193,"language":97},[95],"$ npm i --save @nestjs\u002Fplatform-fastify\n",[99,195,193],{"__ignoreMap":47},[17,197,198,199,201],{},"main.tsのbootstrap関数にて、",[14,200,156],{},"を利用するためパッケージをインポートし次のような構成をします。",[92,203,206],{"className":204,"code":205,"language":97},[95],"const app = await NestFactory.create\u003CNestFastifyApplication>(\n  AppModule,\n  new FastifyAdapter()\n);\n",[99,207,205],{"__ignoreMap":47},[10,209,211],{"id":210},"nestjsのルーティング","NestJSのルーティング",[17,213,214,215,218],{},"NestJSのルーティングは非常に定義しやすいです。 \u002Fusersのためのルーティングを定義するには、",[14,216,217],{},"@Controller（ 'users'）"," 修飾子を使用さえすればいいです。Post、Get、Put、Delete、Param、Bodyなどのルーティングについて該当するNestjsアノテーションさえ付ければいいです。",[220,221,222,226,229],"ul",{},[223,224,225],"li",{},"GET \u002Fusers",[223,227,228],{},"GET \u002Fusers\u002Fid",[223,230,231],{},"POST \u002Fusers",[17,233,234,237],{},[14,235,236],{},"@Controller('users')"," 修飾子に'users'のパスの接頭語を利用することで関連する各ルーティングをグループ化して同じコードを最低限に減少させることができます。",[92,239,242],{"className":240,"code":241,"language":97},[95],"@Controller('users')\nexport class UsersController {\n  @Get()\n  find() {\n    return this.usersService.find();\n  }\n  @Get(':id')\n  findById(@Param('id') id) {\n    return this.usersService.findById(id);\n  }\n  @Post()\n  add(@Body() createUserDto: CreateUserDto) {\n    return this.usersService.add(createUserDto);\n  }\n  @Patch(':id')\n  update(@Param('id') id, @Body() updateUserDto: UpdateUserDto) {\n    return this.usersService.update(id, updateUserDto);\n  }\n}\n",[99,243,241],{"__ignoreMap":47},[17,245,246,249],{},[14,247,248],{},"@Body ()"," 修飾子を関数に入れることでリクエストオブジェクトがハンドラーにアクセスすることができます。",[92,251,254],{"className":252,"code":253,"language":97},[95],"@Post()\n add(@Body() createUserDto: CreateUserDto) {\n   return this.usersService.add(createUserDto);\n}\n",[99,255,253],{"__ignoreMap":47},[17,257,258,261,262,265],{},[14,259,260],{},"@Param ()"," 修飾子を用いることでメソッドのパラメーターにアクセスすることができます。以下の例を見てください。idのパラメーターにアクセスするため、",[14,263,264],{},"@Param('id')"," をコールするだけでよいです。",[92,267,270],{"className":268,"code":269,"language":97},[95],"@Get(':id')\n  findById(@Param('id') id) {\n    return this.usersService.findById(id);\n}\n",[99,271,269],{"__ignoreMap":47},[10,273,275],{"id":274},"nestjsの概念",[14,276,277],{},"NestJSの概念",[17,279,280,283],{},[14,281,282],{},"Providers："," Providers（プロバイダ）とはNestの基本概念です。基本的なNestクラスの多くはservices、repositories、factories、helpers等のプロバイダとして扱われます。プロバイダのアイデアは依存関係を注入できることです。これはオブジェクトが互いにさまざまな関係を作成できることを意味し、オブジェクトのインスタンスを「繋げる」機能はNestランタイムシステムに委任できます。プロバイダは単に@Injectable()修飾子が付けられたクラスです。",[17,285,286],{},"まずは、簡単なサービスを作成してみましょう。UsersService のサービスはデータの保存と取得を担当し、UsersControllerで使用されるように設計されます。そのため、これらのクラスが関係になるようなプロバイダを作成すべきです。",[92,288,291],{"className":289,"code":290,"language":97},[95],"@Injectable()\nexport class UsersService {\n  constructor(\n    @InjectRepository(User)\n    private usersRepository: Repository\u003CUser>,\n  ) {}\n  async findOne(username: string): Promise\u003CUser | undefined> {\n    return this.usersRepository.findOne({ name: username, deleted: 0 });\n  }\n  async find(option?: FindManyOptions\u003CUser>): Promise\u003CUser[]> {\n    return this.usersRepository.find(option);\n  }\n  async findById(id: number): Promise\u003CUser> {\n    return this.usersRepository.findOne(id);\n  }\n  async add(user: CreateUserDto): Promise\u003CUser> {\n    return this.usersRepository.save(user);\n  }\n  async update(user: UpdateUserDto): Promise\u003CUser> {\n    return this.usersRepository.save(user);\n  }\n}\n",[99,292,290],{"__ignoreMap":47},[17,294,295,298,299,302],{},[14,296,297],{},"HINT："," CLI（",[99,300,301],{},"nest g service cats","コマンド）を用いることでサービスを作成できます。 @Injectable修飾子()はNestがこれがプロバイダーであるということを知らせるのを手助けします。そのため、Nestは自動的にこのクラスのインスタンスを作成し、UserControllerにそれを渡します。",[17,304,305,308],{},[14,306,307],{},"Modules："," Modules（モジュール）は@Module()修飾子が付けられたクラスです。@Module()修飾子はアプリケーション構造をNestが整理するために使うメタデータを提供します。",[17,310,311,315],{},[42,312],{"className":313,"alt":47,"src":314,"style":49},[45,46],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F07\u002F28110509\u002Fmodule.png",[51,316],{},[17,318,319],{},"アプリケーション毎には少なくとも一つのモジュール、ルートモジュールがあります。モジュールはアプリケーションのコンポーネントまたは性能を象徴します。コンポーネントを整理する効果的な方法としてモジュール化がおすすめです。ソースの構成は以下のようになります。",[17,321,322,327],{},[42,323],{"className":324,"alt":47,"src":325,"style":326},[45,46],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F07\u002F28121304\u002Fsource-structure.jpg","width: 50%;",[51,328],{},[10,330,332],{"id":331},"graphql",[14,333,334],{},"GraphQL",[17,336,337,338,344],{},"周知の通りに、",[14,339,340],{},[64,341,334],{"href":342,"rel":343},"https:\u002F\u002Fgraphql.org\u002F",[68]," とは既存データ抽出とデータロードに使われるAPI向けのグラフクエリ言語です。Nestを使って安定なGraphQLサーバーを構築できます。",[17,346,347],{},"GraphQLについての基礎知識を持っていることを前提とし、NestでのGraphQLの使い方を調べてみましょう。",[17,349,350],{},"必要なパッケージを予めインストールしておきます。",[92,352,355],{"className":353,"code":354,"language":97},[95],"npm i --save @nestjs\u002Fgraphql apollo-server-express graphql-tools graphql type-graphql\n",[99,356,354],{"__ignoreMap":47},[17,358,359],{},"お使いのプラットフォームがExpressかFastifyであるかによって、apollo-server-expressまたはapollo-server-fastifyをインストールしなければなりません。",[17,361,362],{},"おすすめのGraphQLの主な概念は以下の通りとなります。",[21,364,365,368,371,374,377],{"style":23},[17,366,367],{},"1. Schema",[17,369,370],{},"2. Query",[17,372,373],{},"3. Mutation",[17,375,376],{},"4. Type",[17,378,379],{},"5. Resolver",[17,381,382],{},"NestJSは、GraphQLアプリケーションを構築するために以下のような二つの方法を提供します。",[21,384,385,388],{"style":23},[17,386,387],{},"1. Schema first",[17,389,390],{},"2. Code first",[17,392,393],{},[14,394,395],{},"まとめ",[17,397,398],{},"前述した通りに、NestJSはたくさんの様々な役立つ機能でサーバサイドのアプリケーションを安易に構築できるように開発者をサポートしてくれます。幾つかのデメリットがありますが、力強さと便利さは選択肢から外せないものです。以下に、そのメリットとデメリットを示します。",[17,400,401],{},[14,402,403],{},"メリット",[220,405,406,409,412,415,418,421,424,427,430],{},[223,407,408],{},"オープンソース",[223,410,411],{},"多くのユーザビリティがあり、強いフレームワーク",[223,413,414],{},"分かりやすいドキュメント",[223,416,417],{},"速やかな開発可能",[223,419,420],{},"バックエンド開発のためのAngularスタイルの構成",[223,422,423],{},"Node.jsのエコシステム",[223,425,426],{},"Graphqlのサポートが容易",[223,428,429],{},"良いアーキテクチャ",[223,431,432],{},"VSCodeでTypescriptがうまく統合している",[17,434,435],{},[14,436,437],{},"デメリット",[220,439,440,443,446,449],{},[223,441,442],{},"ユーザーの利用数が少なくて、Stackoverflowでの該当記事が少ない",[223,444,445],{},"致命的な影響があるアップデート",[223,447,448],{},"安定性なし",[223,450,451],{},"デバッグしにくい",[10,453,455],{"id":454},"参照元",[14,456,454],{},[17,458,459],{},[64,460,461],{"href":461,"rel":462},"https:\u002F\u002Fexpressjs.com\u002F",[68],[17,464,465],{},[64,466,467],{"href":467,"rel":468},"https:\u002F\u002Fwww.fastify.io\u002F",[68],[17,470,471],{},[64,472,473],{"href":473,"rel":474},"https:\u002F\u002Fdocs.nestjs.com\u002Fgraphql\u002Fquick-start",[68],[17,476,477],{},[64,478,479],{"href":479,"rel":480},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fperformance",[68],[17,482,483],{},[64,484,485],{"href":485,"rel":486},"https:\u002F\u002Fdocs.nestjs.com\u002Ffundamentals\u002Fexecution-context#reflection-and-metadata",[68],[17,488,489],{},[64,490,491],{"href":491,"rel":492},"https:\u002F\u002Fmedium.com\u002Fgoogle-developers\u002Fexploring-es7-decorators-76ecb65fb841",[68],[17,494,495],{},[64,496,497],{"href":497,"rel":498},"https:\u002F\u002Fwww.apollographql.com\u002Fblog\u002Fgraphql-vs-rest-5d425123e34b\u002F",[68],{"title":47,"searchDepth":500,"depth":500,"links":501},2,[502,503,504,505,506,507,508],{"id":12,"depth":500,"text":12},{"id":58,"depth":500,"text":59},{"id":143,"depth":500,"text":146},{"id":210,"depth":500,"text":211},{"id":274,"depth":500,"text":277},{"id":331,"depth":500,"text":334},{"id":454,"depth":500,"text":454},"tech talk","Briswell Vietnam Co Ltd","2020-08-19","md",{},true,"\u002Fja\u002Fnews\u002Fwhat-is-nestjs",null,{"title":5,"description":19},"ja\u002Fnews\u002Fwhat-is-nestjs","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2020\u002F07\u002F28093657\u002Fnestjs.png","VGAWHHy3F_8aDJIoPw1VLsY6_50IEsiiMsOyWFTNLvI",1785320533982]