[{"data":1,"prerenderedAt":3145},["ShallowReactive",2],{"post-nestjs-typeorm-crud-implementation":3},{"id":4,"title":5,"body":6,"date":3133,"description":3134,"extension":3135,"meta":3136,"navigation":65,"path":3141,"seo":3142,"stem":3143,"__hash__":3144},"blog\u002Fblog\u002Fnestjs-typeorm-crud-implementation.md","NestJS + TypeORM 0.3でCRUD APIを構築する",{"type":7,"value":8,"toc":3093},"minimark",[9,13,17,27,30,97,100,104,112,115,131,134,139,235,239,242,359,362,396,399,417,421,424,545,553,557,560,583,586,594,598,604,703,711,715,820,833,837,1029,1033,1194,1201,1204,1207,1233,1236,1259,1270,1273,1276,1295,1299,1383,1386,1499,1506,1510,1514,1628,1632,2328,2332,2865,2869,2872,2920,2923,2944,2947,2990,2993,3014,3017,3042,3045,3048,3053,3067,3072,3086,3089],[10,11,12],"h2",{"id":12},"はじめに",[14,15,16],"p",{},"NestJS V.9とTypeORM 0.3系を使った、最新のREST API構築方法を解説します。",[14,18,19,20],{},"GitHubリポジトリ: ",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fgithub.com\u002Fnaoki-haba\u002Fnestjs-demo-rest-api",[25],"nofollow","nestjs-demo-rest-api",[10,28,29],{"id":29},"環境",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-bash shiki shiki-themes github-light github-dark","nest -v\n# 9.1.4\n\n# package.json\n\"@nestjs\u002Ftypeorm\": \"^9.0.1\"\n\"typeorm\": \"^0.3.10\"\n","bash","",[38,39,40,53,60,67,73,86],"code",{"__ignoreMap":36},[41,42,45,49],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sScJk","nest",[41,50,52],{"class":51},"sj4cs"," -v\n",[41,54,56],{"class":43,"line":55},2,[41,57,59],{"class":58},"sJ8bj","# 9.1.4\n",[41,61,63],{"class":43,"line":62},3,[41,64,66],{"emptyLinePlaceholder":65},true,"\n",[41,68,70],{"class":43,"line":69},4,[41,71,72],{"class":58},"# package.json\n",[41,74,76,79,82],{"class":43,"line":75},5,[41,77,78],{"class":47},"\"@nestjs\u002Ftypeorm\"",[41,80,81],{"class":51},":",[41,83,85],{"class":84},"sZZnC"," \"^9.0.1\"\n",[41,87,89,92,94],{"class":43,"line":88},6,[41,90,91],{"class":47},"\"typeorm\"",[41,93,81],{"class":51},[41,95,96],{"class":84}," \"^0.3.10\"\n",[14,98,99],{},"注意: Windows環境での動作確認は行っていません。",[10,101,103],{"id":102},"nestjsとは","NestJSとは",[14,105,106,111],{},[21,107,110],{"href":108,"rel":109},"https:\u002F\u002Fnestjs.com\u002F",[25],"NestJS","は、効率的でスケーラブルなNode.jsサーバーサイドアプリケーションを構築するためのフレームワークです。",[14,113,114],{},"主な特徴：",[116,117,118,122,125,128],"ul",{},[119,120,121],"li",{},"TypeScriptを完全サポート",[119,123,124],{},"OOP（オブジェクト指向）、FP（関数型）、FRP（関数型リアクティブ）の要素を統合",[119,126,127],{},"Angular風のアーキテクチャ",[119,129,130],{},"依存性注入（DI）によるテスタビリティの向上",[10,132,133],{"id":133},"プロジェクトセットアップ",[135,136,138],"h3",{"id":137},"nestjs-cliのインストール","NestJS CLIのインストール",[31,140,142],{"className":33,"code":141,"language":35,"meta":36,"style":36},"# 作業ディレクトリを作成\nmkdir nestjs-sample\ncd nestjs-sample\n\n# NestJS CLIをグローバルにインストール\nnpm install -g @nestjs\u002Fcli\n\n# プロジェクトを作成（npmを選択）\nnest new sample\n\n# 依存関係をインストール\ncd sample\nnpm install\n",[38,143,144,149,157,164,168,173,187,192,198,209,214,220,227],{"__ignoreMap":36},[41,145,146],{"class":43,"line":44},[41,147,148],{"class":58},"# 作業ディレクトリを作成\n",[41,150,151,154],{"class":43,"line":55},[41,152,153],{"class":47},"mkdir",[41,155,156],{"class":84}," nestjs-sample\n",[41,158,159,162],{"class":43,"line":62},[41,160,161],{"class":51},"cd",[41,163,156],{"class":84},[41,165,166],{"class":43,"line":69},[41,167,66],{"emptyLinePlaceholder":65},[41,169,170],{"class":43,"line":75},[41,171,172],{"class":58},"# NestJS CLIをグローバルにインストール\n",[41,174,175,178,181,184],{"class":43,"line":88},[41,176,177],{"class":47},"npm",[41,179,180],{"class":84}," install",[41,182,183],{"class":51}," -g",[41,185,186],{"class":84}," @nestjs\u002Fcli\n",[41,188,190],{"class":43,"line":189},7,[41,191,66],{"emptyLinePlaceholder":65},[41,193,195],{"class":43,"line":194},8,[41,196,197],{"class":58},"# プロジェクトを作成（npmを選択）\n",[41,199,201,203,206],{"class":43,"line":200},9,[41,202,48],{"class":47},[41,204,205],{"class":84}," new",[41,207,208],{"class":84}," sample\n",[41,210,212],{"class":43,"line":211},10,[41,213,66],{"emptyLinePlaceholder":65},[41,215,217],{"class":43,"line":216},11,[41,218,219],{"class":58},"# 依存関係をインストール\n",[41,221,223,225],{"class":43,"line":222},12,[41,224,161],{"class":51},[41,226,208],{"class":84},[41,228,230,232],{"class":43,"line":229},13,[41,231,177],{"class":47},[41,233,234],{"class":84}," install\n",[135,236,238],{"id":237},"ポート番号の変更オプション","ポート番号の変更（オプション）",[14,240,241],{},"デフォルトの3000番ポートを変更する場合：",[31,243,247],{"className":244,"code":245,"language":246,"meta":36,"style":36},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F src\u002Fmain.ts\nimport { NestFactory } from '@nestjs\u002Fcore'\nimport { AppModule } from '.\u002Fapp.module'\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule)\n  await app.listen(3001) \u002F\u002F ポート番号を変更\n}\nbootstrap()\n","typescript",[38,248,249,254,270,282,286,300,323,346,351],{"__ignoreMap":36},[41,250,251],{"class":43,"line":44},[41,252,253],{"class":58},"\u002F\u002F src\u002Fmain.ts\n",[41,255,256,260,264,267],{"class":43,"line":55},[41,257,259],{"class":258},"szBVR","import",[41,261,263],{"class":262},"sVt8B"," { NestFactory } ",[41,265,266],{"class":258},"from",[41,268,269],{"class":84}," '@nestjs\u002Fcore'\n",[41,271,272,274,277,279],{"class":43,"line":62},[41,273,259],{"class":258},[41,275,276],{"class":262}," { AppModule } ",[41,278,266],{"class":258},[41,280,281],{"class":84}," '.\u002Fapp.module'\n",[41,283,284],{"class":43,"line":69},[41,285,66],{"emptyLinePlaceholder":65},[41,287,288,291,294,297],{"class":43,"line":75},[41,289,290],{"class":258},"async",[41,292,293],{"class":258}," function",[41,295,296],{"class":47}," bootstrap",[41,298,299],{"class":262},"() {\n",[41,301,302,305,308,311,314,317,320],{"class":43,"line":88},[41,303,304],{"class":258},"  const",[41,306,307],{"class":51}," app",[41,309,310],{"class":258}," =",[41,312,313],{"class":258}," await",[41,315,316],{"class":262}," NestFactory.",[41,318,319],{"class":47},"create",[41,321,322],{"class":262},"(AppModule)\n",[41,324,325,328,331,334,337,340,343],{"class":43,"line":189},[41,326,327],{"class":258},"  await",[41,329,330],{"class":262}," app.",[41,332,333],{"class":47},"listen",[41,335,336],{"class":262},"(",[41,338,339],{"class":51},"3001",[41,341,342],{"class":262},") ",[41,344,345],{"class":58},"\u002F\u002F ポート番号を変更\n",[41,347,348],{"class":43,"line":194},[41,349,350],{"class":262},"}\n",[41,352,353,356],{"class":43,"line":200},[41,354,355],{"class":47},"bootstrap",[41,357,358],{"class":262},"()\n",[135,360,361],{"id":361},"アプリケーションの起動",[31,363,365],{"className":33,"code":364,"language":35,"meta":36,"style":36},"npm run start:dev\n\n# 以下のログが表示されればOK\n# [Nest] Starting Nest application...\n# [Nest] Nest application successfully started\n",[38,366,367,377,381,386,391],{"__ignoreMap":36},[41,368,369,371,374],{"class":43,"line":44},[41,370,177],{"class":47},[41,372,373],{"class":84}," run",[41,375,376],{"class":84}," start:dev\n",[41,378,379],{"class":43,"line":55},[41,380,66],{"emptyLinePlaceholder":65},[41,382,383],{"class":43,"line":62},[41,384,385],{"class":58},"# 以下のログが表示されればOK\n",[41,387,388],{"class":43,"line":69},[41,389,390],{"class":58},"# [Nest] Starting Nest application...\n",[41,392,393],{"class":43,"line":75},[41,394,395],{"class":58},"# [Nest] Nest application successfully started\n",[14,397,398],{},"動作確認：",[31,400,402],{"className":33,"code":401,"language":35,"meta":36,"style":36},"curl http:\u002F\u002Flocalhost:3001\n# \"Hello World!\" が返ればOK\n",[38,403,404,412],{"__ignoreMap":36},[41,405,406,409],{"class":43,"line":44},[41,407,408],{"class":47},"curl",[41,410,411],{"class":84}," http:\u002F\u002Flocalhost:3001\n",[41,413,414],{"class":43,"line":55},[41,415,416],{"class":58},"# \"Hello World!\" が返ればOK\n",[10,418,420],{"id":419},"crudリソースの生成","CRUDリソースの生成",[14,422,423],{},"NestJS CLIを使って、CRUD操作の雛形を自動生成します。",[31,425,427],{"className":33,"code":426,"language":35,"meta":36,"style":36},"# --no-specでテストファイルを生成しない\nnest generate resource users --no-spec\n\n# REST APIを選択\n? What transport layer do you use? REST API\n\n# CRUD entry pointsを有効化\n? Would you like to generate CRUD entry points? Yes\n\n# 以下のファイルが生成される\n# src\u002Fusers\u002Fusers.controller.ts\n# src\u002Fusers\u002Fusers.service.ts\n# src\u002Fusers\u002Fusers.module.ts\n# src\u002Fusers\u002Fdto\u002Fcreate-user.dto.ts\n# src\u002Fusers\u002Fdto\u002Fupdate-user.dto.ts\n# src\u002Fusers\u002Fentities\u002Fuser.entity.ts\n",[38,428,429,434,450,454,459,482,486,491,503,507,512,517,522,527,533,539],{"__ignoreMap":36},[41,430,431],{"class":43,"line":44},[41,432,433],{"class":58},"# --no-specでテストファイルを生成しない\n",[41,435,436,438,441,444,447],{"class":43,"line":55},[41,437,48],{"class":47},[41,439,440],{"class":84}," generate",[41,442,443],{"class":84}," resource",[41,445,446],{"class":84}," users",[41,448,449],{"class":51}," --no-spec\n",[41,451,452],{"class":43,"line":62},[41,453,66],{"emptyLinePlaceholder":65},[41,455,456],{"class":43,"line":69},[41,457,458],{"class":58},"# REST APIを選択\n",[41,460,461,464,467,470,473,476,479],{"class":43,"line":75},[41,462,463],{"class":258},"?",[41,465,466],{"class":262}," What transport layer ",[41,468,469],{"class":258},"do",[41,471,472],{"class":47}," you",[41,474,475],{"class":84}," use?",[41,477,478],{"class":84}," REST",[41,480,481],{"class":84}," API\n",[41,483,484],{"class":43,"line":88},[41,485,66],{"emptyLinePlaceholder":65},[41,487,488],{"class":43,"line":189},[41,489,490],{"class":58},"# CRUD entry pointsを有効化\n",[41,492,493,495,498,500],{"class":43,"line":194},[41,494,463],{"class":258},[41,496,497],{"class":262}," Would you like to generate CRUD entry points",[41,499,463],{"class":258},[41,501,502],{"class":262}," Yes\n",[41,504,505],{"class":43,"line":200},[41,506,66],{"emptyLinePlaceholder":65},[41,508,509],{"class":43,"line":211},[41,510,511],{"class":58},"# 以下のファイルが生成される\n",[41,513,514],{"class":43,"line":216},[41,515,516],{"class":58},"# src\u002Fusers\u002Fusers.controller.ts\n",[41,518,519],{"class":43,"line":222},[41,520,521],{"class":58},"# src\u002Fusers\u002Fusers.service.ts\n",[41,523,524],{"class":43,"line":229},[41,525,526],{"class":58},"# src\u002Fusers\u002Fusers.module.ts\n",[41,528,530],{"class":43,"line":529},14,[41,531,532],{"class":58},"# src\u002Fusers\u002Fdto\u002Fcreate-user.dto.ts\n",[41,534,536],{"class":43,"line":535},15,[41,537,538],{"class":58},"# src\u002Fusers\u002Fdto\u002Fupdate-user.dto.ts\n",[41,540,542],{"class":43,"line":541},16,[41,543,544],{"class":58},"# src\u002Fusers\u002Fentities\u002Fuser.entity.ts\n",[14,546,547,548],{},"公式ドキュメント: ",[21,549,552],{"href":550,"rel":551},"https:\u002F\u002Fdocs.nestjs.com\u002Frecipes\u002Fcrud-generator",[25],"CRUD Generator",[10,554,556],{"id":555},"typeormのセットアップ","TypeORMのセットアップ",[135,558,559],{"id":559},"パッケージのインストール",[31,561,563],{"className":33,"code":562,"language":35,"meta":36,"style":36},"npm install --save @nestjs\u002Ftypeorm typeorm sqlite3\n",[38,564,565],{"__ignoreMap":36},[41,566,567,569,571,574,577,580],{"class":43,"line":44},[41,568,177],{"class":47},[41,570,180],{"class":84},[41,572,573],{"class":51}," --save",[41,575,576],{"class":84}," @nestjs\u002Ftypeorm",[41,578,579],{"class":84}," typeorm",[41,581,582],{"class":84}," sqlite3\n",[14,584,585],{},"今回は開発環境の簡便さのためSQLiteを使用しますが、本番環境ではMySQL、PostgreSQLなどの使用を推奨します。",[14,587,588,589],{},"参考: ",[21,590,593],{"href":591,"rel":592},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fdatabase",[25],"NestJS Database",[135,595,597],{"id":596},"typeorm設定ファイルの作成","TypeORM設定ファイルの作成",[14,599,600],{},[601,602,603],"strong",{},"⚠️ 警告：本番環境では環境変数から接続情報を取得してください。ハードコーディングは避けてください。",[31,605,607],{"className":244,"code":606,"language":246,"meta":36,"style":36},"\u002F\u002F typeOrm.config.ts\nimport { DataSource } from 'typeorm'\n\nexport default new DataSource({\n  type: 'sqlite',\n  database: 'data\u002Fdev.sqlite',\n  entities: ['dist\u002F**\u002Fentities\u002F**\u002F*.entity.js'],\n  migrations: ['dist\u002F**\u002Fmigrations\u002F**\u002F*.js'],\n  logging: true,\n})\n",[38,608,609,614,626,630,646,657,667,678,688,698],{"__ignoreMap":36},[41,610,611],{"class":43,"line":44},[41,612,613],{"class":58},"\u002F\u002F typeOrm.config.ts\n",[41,615,616,618,621,623],{"class":43,"line":55},[41,617,259],{"class":258},[41,619,620],{"class":262}," { DataSource } ",[41,622,266],{"class":258},[41,624,625],{"class":84}," 'typeorm'\n",[41,627,628],{"class":43,"line":62},[41,629,66],{"emptyLinePlaceholder":65},[41,631,632,635,638,640,643],{"class":43,"line":69},[41,633,634],{"class":258},"export",[41,636,637],{"class":258}," default",[41,639,205],{"class":258},[41,641,642],{"class":47}," DataSource",[41,644,645],{"class":262},"({\n",[41,647,648,651,654],{"class":43,"line":75},[41,649,650],{"class":262},"  type: ",[41,652,653],{"class":84},"'sqlite'",[41,655,656],{"class":262},",\n",[41,658,659,662,665],{"class":43,"line":88},[41,660,661],{"class":262},"  database: ",[41,663,664],{"class":84},"'data\u002Fdev.sqlite'",[41,666,656],{"class":262},[41,668,669,672,675],{"class":43,"line":189},[41,670,671],{"class":262},"  entities: [",[41,673,674],{"class":84},"'dist\u002F**\u002Fentities\u002F**\u002F*.entity.js'",[41,676,677],{"class":262},"],\n",[41,679,680,683,686],{"class":43,"line":194},[41,681,682],{"class":262},"  migrations: [",[41,684,685],{"class":84},"'dist\u002F**\u002Fmigrations\u002F**\u002F*.js'",[41,687,677],{"class":262},[41,689,690,693,696],{"class":43,"line":200},[41,691,692],{"class":262},"  logging: ",[41,694,695],{"class":51},"true",[41,697,656],{"class":262},[41,699,700],{"class":43,"line":211},[41,701,702],{"class":262},"})\n",[14,704,705,706],{},"参考記事: ",[21,707,710],{"href":708,"rel":709},"https:\u002F\u002Fwanago.io\u002F2022\u002F07\u002F25\u002Fapi-nestjs-database-migrations-typeorm\u002F",[25],"API with NestJS - Database migrations with TypeORM",[135,712,714],{"id":713},"typeormコマンドの追加","TypeORMコマンドの追加",[31,716,720],{"className":717,"code":718,"language":719,"meta":36,"style":36},"language-json shiki shiki-themes github-light github-dark","\u002F\u002F package.json\n{\n  \"scripts\": {\n    \"start:dev\": \"nest build && nest start --watch\",\n    \"typeorm\": \"ts-node .\u002Fnode_modules\u002Ftypeorm\u002Fcli\",\n    \"typeorm:run-migrations\": \"npm run typeorm migration:run -- -d .\u002FtypeOrm.config.ts\",\n    \"typeorm:generate-migration\": \"npm run typeorm -- -d .\u002FtypeOrm.config.ts migration:generate .\u002Fmigrations\u002F$npm_config_name\",\n    \"typeorm:create-migration\": \"npm run typeorm -- migration:create .\u002Fmigrations\u002F$npm_config_name\",\n    \"typeorm:revert-migration\": \"npm run typeorm -- -d .\u002FtypeOrm.config.ts migration:revert\"\n  }\n}\n","json",[38,721,722,727,732,740,753,765,777,789,801,811,816],{"__ignoreMap":36},[41,723,724],{"class":43,"line":44},[41,725,726],{"class":58},"\u002F\u002F package.json\n",[41,728,729],{"class":43,"line":55},[41,730,731],{"class":262},"{\n",[41,733,734,737],{"class":43,"line":62},[41,735,736],{"class":51},"  \"scripts\"",[41,738,739],{"class":262},": {\n",[41,741,742,745,748,751],{"class":43,"line":69},[41,743,744],{"class":51},"    \"start:dev\"",[41,746,747],{"class":262},": ",[41,749,750],{"class":84},"\"nest build && nest start --watch\"",[41,752,656],{"class":262},[41,754,755,758,760,763],{"class":43,"line":75},[41,756,757],{"class":51},"    \"typeorm\"",[41,759,747],{"class":262},[41,761,762],{"class":84},"\"ts-node .\u002Fnode_modules\u002Ftypeorm\u002Fcli\"",[41,764,656],{"class":262},[41,766,767,770,772,775],{"class":43,"line":88},[41,768,769],{"class":51},"    \"typeorm:run-migrations\"",[41,771,747],{"class":262},[41,773,774],{"class":84},"\"npm run typeorm migration:run -- -d .\u002FtypeOrm.config.ts\"",[41,776,656],{"class":262},[41,778,779,782,784,787],{"class":43,"line":189},[41,780,781],{"class":51},"    \"typeorm:generate-migration\"",[41,783,747],{"class":262},[41,785,786],{"class":84},"\"npm run typeorm -- -d .\u002FtypeOrm.config.ts migration:generate .\u002Fmigrations\u002F$npm_config_name\"",[41,788,656],{"class":262},[41,790,791,794,796,799],{"class":43,"line":194},[41,792,793],{"class":51},"    \"typeorm:create-migration\"",[41,795,747],{"class":262},[41,797,798],{"class":84},"\"npm run typeorm -- migration:create .\u002Fmigrations\u002F$npm_config_name\"",[41,800,656],{"class":262},[41,802,803,806,808],{"class":43,"line":200},[41,804,805],{"class":51},"    \"typeorm:revert-migration\"",[41,807,747],{"class":262},[41,809,810],{"class":84},"\"npm run typeorm -- -d .\u002FtypeOrm.config.ts migration:revert\"\n",[41,812,813],{"class":43,"line":211},[41,814,815],{"class":262},"  }\n",[41,817,818],{"class":43,"line":216},[41,819,350],{"class":262},[14,821,822,747,825,828,829,832],{},[601,823,824],{},"Windows環境の場合",[38,826,827],{},"$npm_config_name","を",[38,830,831],{},"%npm_config_name%","に変更してください。",[135,834,836],{"id":835},"appmoduleへの統合","AppModuleへの統合",[31,838,840],{"className":244,"code":839,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fapp.module.ts\nimport { Module } from '@nestjs\u002Fcommon'\nimport { TypeOrmModule } from '@nestjs\u002Ftypeorm'\nimport { AppController } from '.\u002Fapp.controller'\nimport { AppService } from '.\u002Fapp.service'\nimport { UsersModule } from '.\u002Fusers\u002Fusers.module'\n\n@Module({\n  imports: [\n    UsersModule,\n    TypeOrmModule.forRoot({\n      type: 'sqlite',\n      database: 'data\u002Fdev.sqlite',\n      logging: true,\n      entities: ['dist\u002F**\u002Fentities\u002F**\u002F*.entity.js'],\n      migrations: ['dist\u002F**\u002Fmigrations\u002F**\u002F*.js'],\n    }),\n  ],\n  controllers: [AppController],\n  providers: [AppService],\n})\nexport class AppModule {}\n",[38,841,842,847,859,871,883,895,907,911,921,926,931,941,950,959,968,977,986,992,998,1004,1010,1015],{"__ignoreMap":36},[41,843,844],{"class":43,"line":44},[41,845,846],{"class":58},"\u002F\u002F src\u002Fapp.module.ts\n",[41,848,849,851,854,856],{"class":43,"line":55},[41,850,259],{"class":258},[41,852,853],{"class":262}," { Module } ",[41,855,266],{"class":258},[41,857,858],{"class":84}," '@nestjs\u002Fcommon'\n",[41,860,861,863,866,868],{"class":43,"line":62},[41,862,259],{"class":258},[41,864,865],{"class":262}," { TypeOrmModule } ",[41,867,266],{"class":258},[41,869,870],{"class":84}," '@nestjs\u002Ftypeorm'\n",[41,872,873,875,878,880],{"class":43,"line":69},[41,874,259],{"class":258},[41,876,877],{"class":262}," { AppController } ",[41,879,266],{"class":258},[41,881,882],{"class":84}," '.\u002Fapp.controller'\n",[41,884,885,887,890,892],{"class":43,"line":75},[41,886,259],{"class":258},[41,888,889],{"class":262}," { AppService } ",[41,891,266],{"class":258},[41,893,894],{"class":84}," '.\u002Fapp.service'\n",[41,896,897,899,902,904],{"class":43,"line":88},[41,898,259],{"class":258},[41,900,901],{"class":262}," { UsersModule } ",[41,903,266],{"class":258},[41,905,906],{"class":84}," '.\u002Fusers\u002Fusers.module'\n",[41,908,909],{"class":43,"line":189},[41,910,66],{"emptyLinePlaceholder":65},[41,912,913,916,919],{"class":43,"line":194},[41,914,915],{"class":262},"@",[41,917,918],{"class":47},"Module",[41,920,645],{"class":262},[41,922,923],{"class":43,"line":200},[41,924,925],{"class":262},"  imports: [\n",[41,927,928],{"class":43,"line":211},[41,929,930],{"class":262},"    UsersModule,\n",[41,932,933,936,939],{"class":43,"line":216},[41,934,935],{"class":262},"    TypeOrmModule.",[41,937,938],{"class":47},"forRoot",[41,940,645],{"class":262},[41,942,943,946,948],{"class":43,"line":222},[41,944,945],{"class":262},"      type: ",[41,947,653],{"class":84},[41,949,656],{"class":262},[41,951,952,955,957],{"class":43,"line":229},[41,953,954],{"class":262},"      database: ",[41,956,664],{"class":84},[41,958,656],{"class":262},[41,960,961,964,966],{"class":43,"line":529},[41,962,963],{"class":262},"      logging: ",[41,965,695],{"class":51},[41,967,656],{"class":262},[41,969,970,973,975],{"class":43,"line":535},[41,971,972],{"class":262},"      entities: [",[41,974,674],{"class":84},[41,976,677],{"class":262},[41,978,979,982,984],{"class":43,"line":541},[41,980,981],{"class":262},"      migrations: [",[41,983,685],{"class":84},[41,985,677],{"class":262},[41,987,989],{"class":43,"line":988},17,[41,990,991],{"class":262},"    }),\n",[41,993,995],{"class":43,"line":994},18,[41,996,997],{"class":262},"  ],\n",[41,999,1001],{"class":43,"line":1000},19,[41,1002,1003],{"class":262},"  controllers: [AppController],\n",[41,1005,1007],{"class":43,"line":1006},20,[41,1008,1009],{"class":262},"  providers: [AppService],\n",[41,1011,1013],{"class":43,"line":1012},21,[41,1014,702],{"class":262},[41,1016,1018,1020,1023,1026],{"class":43,"line":1017},22,[41,1019,634],{"class":258},[41,1021,1022],{"class":258}," class",[41,1024,1025],{"class":47}," AppModule",[41,1027,1028],{"class":262}," {}\n",[10,1030,1032],{"id":1031},"entity定義","Entity定義",[31,1034,1036],{"className":244,"code":1035,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fusers\u002Fentities\u002Fuser.entity.ts\nimport { Column, PrimaryGeneratedColumn, Entity } from 'typeorm'\n\n@Entity('users')\nexport class User {\n  @PrimaryGeneratedColumn({ comment: 'アカウントID' })\n  readonly id: number\n\n  @Column('varchar', { comment: 'アカウント名' })\n  name: string\n\n  constructor(name: string) {\n    this.name = name\n  }\n}\n",[38,1037,1038,1043,1054,1058,1073,1085,1102,1116,1120,1140,1150,1154,1172,1186,1190],{"__ignoreMap":36},[41,1039,1040],{"class":43,"line":44},[41,1041,1042],{"class":58},"\u002F\u002F src\u002Fusers\u002Fentities\u002Fuser.entity.ts\n",[41,1044,1045,1047,1050,1052],{"class":43,"line":55},[41,1046,259],{"class":258},[41,1048,1049],{"class":262}," { Column, PrimaryGeneratedColumn, Entity } ",[41,1051,266],{"class":258},[41,1053,625],{"class":84},[41,1055,1056],{"class":43,"line":62},[41,1057,66],{"emptyLinePlaceholder":65},[41,1059,1060,1062,1065,1067,1070],{"class":43,"line":69},[41,1061,915],{"class":262},[41,1063,1064],{"class":47},"Entity",[41,1066,336],{"class":262},[41,1068,1069],{"class":84},"'users'",[41,1071,1072],{"class":262},")\n",[41,1074,1075,1077,1079,1082],{"class":43,"line":75},[41,1076,634],{"class":258},[41,1078,1022],{"class":258},[41,1080,1081],{"class":47}," User",[41,1083,1084],{"class":262}," {\n",[41,1086,1087,1090,1093,1096,1099],{"class":43,"line":88},[41,1088,1089],{"class":262},"  @",[41,1091,1092],{"class":47},"PrimaryGeneratedColumn",[41,1094,1095],{"class":262},"({ comment: ",[41,1097,1098],{"class":84},"'アカウントID'",[41,1100,1101],{"class":262}," })\n",[41,1103,1104,1107,1111,1113],{"class":43,"line":189},[41,1105,1106],{"class":258},"  readonly",[41,1108,1110],{"class":1109},"s4XuR"," id",[41,1112,81],{"class":258},[41,1114,1115],{"class":51}," number\n",[41,1117,1118],{"class":43,"line":194},[41,1119,66],{"emptyLinePlaceholder":65},[41,1121,1122,1124,1127,1129,1132,1135,1138],{"class":43,"line":200},[41,1123,1089],{"class":262},[41,1125,1126],{"class":47},"Column",[41,1128,336],{"class":262},[41,1130,1131],{"class":84},"'varchar'",[41,1133,1134],{"class":262},", { comment: ",[41,1136,1137],{"class":84},"'アカウント名'",[41,1139,1101],{"class":262},[41,1141,1142,1145,1147],{"class":43,"line":211},[41,1143,1144],{"class":1109},"  name",[41,1146,81],{"class":258},[41,1148,1149],{"class":51}," string\n",[41,1151,1152],{"class":43,"line":216},[41,1153,66],{"emptyLinePlaceholder":65},[41,1155,1156,1159,1161,1164,1166,1169],{"class":43,"line":222},[41,1157,1158],{"class":258},"  constructor",[41,1160,336],{"class":262},[41,1162,1163],{"class":1109},"name",[41,1165,81],{"class":258},[41,1167,1168],{"class":51}," string",[41,1170,1171],{"class":262},") {\n",[41,1173,1174,1177,1180,1183],{"class":43,"line":229},[41,1175,1176],{"class":51},"    this",[41,1178,1179],{"class":262},".name ",[41,1181,1182],{"class":258},"=",[41,1184,1185],{"class":262}," name\n",[41,1187,1188],{"class":43,"line":529},[41,1189,815],{"class":262},[41,1191,1192],{"class":43,"line":535},[41,1193,350],{"class":262},[14,1195,547,1196],{},[21,1197,1200],{"href":1198,"rel":1199},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fdatabase#repository-pattern",[25],"NestJS Database - Entities",[10,1202,1203],{"id":1203},"マイグレーション",[135,1205,1206],{"id":1206},"マイグレーションファイルの生成",[31,1208,1210],{"className":33,"code":1209,"language":35,"meta":36,"style":36},"npm run typeorm:generate-migration --name=CreateUser\n\n# Migration .\u002Fmigrations\u002F1665664827418-CreateUser.ts has been generated successfully.\n",[38,1211,1212,1224,1228],{"__ignoreMap":36},[41,1213,1214,1216,1218,1221],{"class":43,"line":44},[41,1215,177],{"class":47},[41,1217,373],{"class":84},[41,1219,1220],{"class":84}," typeorm:generate-migration",[41,1222,1223],{"class":51}," --name=CreateUser\n",[41,1225,1226],{"class":43,"line":55},[41,1227,66],{"emptyLinePlaceholder":65},[41,1229,1230],{"class":43,"line":62},[41,1231,1232],{"class":58},"# Migration .\u002Fmigrations\u002F1665664827418-CreateUser.ts has been generated successfully.\n",[135,1234,1235],{"id":1235},"マイグレーションの実行",[31,1237,1239],{"className":33,"code":1238,"language":35,"meta":36,"style":36},"npm run typeorm:run-migrations\n\n# Migration CreateUser1665664827418 has been executed successfully.\n",[38,1240,1241,1250,1254],{"__ignoreMap":36},[41,1242,1243,1245,1247],{"class":43,"line":44},[41,1244,177],{"class":47},[41,1246,373],{"class":84},[41,1248,1249],{"class":84}," typeorm:run-migrations\n",[41,1251,1252],{"class":43,"line":55},[41,1253,66],{"emptyLinePlaceholder":65},[41,1255,1256],{"class":43,"line":62},[41,1257,1258],{"class":58},"# Migration CreateUser1665664827418 has been executed successfully.\n",[14,1260,1261,1262,1265,1266,1269],{},"マイグレーション実行後、",[38,1263,1264],{},"data\u002Fdev.sqlite","ファイルが作成され、",[38,1267,1268],{},"users","テーブルが生成されます。",[10,1271,1272],{"id":1272},"バリデーションの実装",[135,1274,559],{"id":1275},"パッケージのインストール-1",[31,1277,1279],{"className":33,"code":1278,"language":35,"meta":36,"style":36},"npm install --save class-validator class-transformer\n",[38,1280,1281],{"__ignoreMap":36},[41,1282,1283,1285,1287,1289,1292],{"class":43,"line":44},[41,1284,177],{"class":47},[41,1286,180],{"class":84},[41,1288,573],{"class":51},[41,1290,1291],{"class":84}," class-validator",[41,1293,1294],{"class":84}," class-transformer\n",[135,1296,1298],{"id":1297},"dtoへのバリデーション追加","DTOへのバリデーション追加",[31,1300,1302],{"className":244,"code":1301,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fusers\u002Fdto\u002Fcreate-user.dto.ts\nimport { IsNotEmpty, MaxLength } from 'class-validator'\n\nexport class CreateUserDto {\n  @IsNotEmpty({ message: 'アカウント名は必須です' })\n  @MaxLength(255, { message: 'アカウント名は255文字以内で入力してください' })\n  name: string\n}\n",[38,1303,1304,1309,1321,1325,1336,1351,1371,1379],{"__ignoreMap":36},[41,1305,1306],{"class":43,"line":44},[41,1307,1308],{"class":58},"\u002F\u002F src\u002Fusers\u002Fdto\u002Fcreate-user.dto.ts\n",[41,1310,1311,1313,1316,1318],{"class":43,"line":55},[41,1312,259],{"class":258},[41,1314,1315],{"class":262}," { IsNotEmpty, MaxLength } ",[41,1317,266],{"class":258},[41,1319,1320],{"class":84}," 'class-validator'\n",[41,1322,1323],{"class":43,"line":62},[41,1324,66],{"emptyLinePlaceholder":65},[41,1326,1327,1329,1331,1334],{"class":43,"line":69},[41,1328,634],{"class":258},[41,1330,1022],{"class":258},[41,1332,1333],{"class":47}," CreateUserDto",[41,1335,1084],{"class":262},[41,1337,1338,1340,1343,1346,1349],{"class":43,"line":75},[41,1339,1089],{"class":262},[41,1341,1342],{"class":47},"IsNotEmpty",[41,1344,1345],{"class":262},"({ message: ",[41,1347,1348],{"class":84},"'アカウント名は必須です'",[41,1350,1101],{"class":262},[41,1352,1353,1355,1358,1360,1363,1366,1369],{"class":43,"line":88},[41,1354,1089],{"class":262},[41,1356,1357],{"class":47},"MaxLength",[41,1359,336],{"class":262},[41,1361,1362],{"class":51},"255",[41,1364,1365],{"class":262},", { message: ",[41,1367,1368],{"class":84},"'アカウント名は255文字以内で入力してください'",[41,1370,1101],{"class":262},[41,1372,1373,1375,1377],{"class":43,"line":189},[41,1374,1144],{"class":1109},[41,1376,81],{"class":258},[41,1378,1149],{"class":51},[41,1380,1381],{"class":43,"line":194},[41,1382,350],{"class":262},[135,1384,1385],{"id":1385},"グローバルバリデーションの有効化",[31,1387,1389],{"className":244,"code":1388,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fmain.ts\nimport { NestFactory } from '@nestjs\u002Fcore'\nimport { AppModule } from '.\u002Fapp.module'\nimport { ValidationPipe } from '@nestjs\u002Fcommon'\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule)\n  app.useGlobalPipes(new ValidationPipe())\n  await app.listen(3001)\n}\nbootstrap()\n",[38,1390,1391,1395,1405,1415,1426,1430,1440,1456,1475,1489,1493],{"__ignoreMap":36},[41,1392,1393],{"class":43,"line":44},[41,1394,253],{"class":58},[41,1396,1397,1399,1401,1403],{"class":43,"line":55},[41,1398,259],{"class":258},[41,1400,263],{"class":262},[41,1402,266],{"class":258},[41,1404,269],{"class":84},[41,1406,1407,1409,1411,1413],{"class":43,"line":62},[41,1408,259],{"class":258},[41,1410,276],{"class":262},[41,1412,266],{"class":258},[41,1414,281],{"class":84},[41,1416,1417,1419,1422,1424],{"class":43,"line":69},[41,1418,259],{"class":258},[41,1420,1421],{"class":262}," { ValidationPipe } ",[41,1423,266],{"class":258},[41,1425,858],{"class":84},[41,1427,1428],{"class":43,"line":75},[41,1429,66],{"emptyLinePlaceholder":65},[41,1431,1432,1434,1436,1438],{"class":43,"line":88},[41,1433,290],{"class":258},[41,1435,293],{"class":258},[41,1437,296],{"class":47},[41,1439,299],{"class":262},[41,1441,1442,1444,1446,1448,1450,1452,1454],{"class":43,"line":189},[41,1443,304],{"class":258},[41,1445,307],{"class":51},[41,1447,310],{"class":258},[41,1449,313],{"class":258},[41,1451,316],{"class":262},[41,1453,319],{"class":47},[41,1455,322],{"class":262},[41,1457,1458,1461,1464,1466,1469,1472],{"class":43,"line":194},[41,1459,1460],{"class":262},"  app.",[41,1462,1463],{"class":47},"useGlobalPipes",[41,1465,336],{"class":262},[41,1467,1468],{"class":258},"new",[41,1470,1471],{"class":47}," ValidationPipe",[41,1473,1474],{"class":262},"())\n",[41,1476,1477,1479,1481,1483,1485,1487],{"class":43,"line":200},[41,1478,327],{"class":258},[41,1480,330],{"class":262},[41,1482,333],{"class":47},[41,1484,336],{"class":262},[41,1486,339],{"class":51},[41,1488,1072],{"class":262},[41,1490,1491],{"class":43,"line":211},[41,1492,350],{"class":262},[41,1494,1495,1497],{"class":43,"line":216},[41,1496,355],{"class":47},[41,1498,358],{"class":262},[14,1500,547,1501],{},[21,1502,1505],{"href":1503,"rel":1504},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fvalidation",[25],"NestJS Validation",[10,1507,1509],{"id":1508},"crud機能の実装","CRUD機能の実装",[135,1511,1513],{"id":1512},"usersmoduleへのtypeorm統合","UsersModuleへのTypeORM統合",[31,1515,1517],{"className":244,"code":1516,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fusers\u002Fusers.module.ts\nimport { Module } from '@nestjs\u002Fcommon'\nimport { TypeOrmModule } from '@nestjs\u002Ftypeorm'\nimport { UsersService } from '.\u002Fusers.service'\nimport { UsersController } from '.\u002Fusers.controller'\nimport { User } from '.\u002Fentities\u002Fuser.entity'\n\n@Module({\n  imports: [TypeOrmModule.forFeature([User])],\n  controllers: [UsersController],\n  providers: [UsersService],\n})\nexport class UsersModule {}\n",[38,1518,1519,1524,1534,1544,1556,1568,1580,1584,1592,1603,1608,1613,1617],{"__ignoreMap":36},[41,1520,1521],{"class":43,"line":44},[41,1522,1523],{"class":58},"\u002F\u002F src\u002Fusers\u002Fusers.module.ts\n",[41,1525,1526,1528,1530,1532],{"class":43,"line":55},[41,1527,259],{"class":258},[41,1529,853],{"class":262},[41,1531,266],{"class":258},[41,1533,858],{"class":84},[41,1535,1536,1538,1540,1542],{"class":43,"line":62},[41,1537,259],{"class":258},[41,1539,865],{"class":262},[41,1541,266],{"class":258},[41,1543,870],{"class":84},[41,1545,1546,1548,1551,1553],{"class":43,"line":69},[41,1547,259],{"class":258},[41,1549,1550],{"class":262}," { UsersService } ",[41,1552,266],{"class":258},[41,1554,1555],{"class":84}," '.\u002Fusers.service'\n",[41,1557,1558,1560,1563,1565],{"class":43,"line":75},[41,1559,259],{"class":258},[41,1561,1562],{"class":262}," { UsersController } ",[41,1564,266],{"class":258},[41,1566,1567],{"class":84}," '.\u002Fusers.controller'\n",[41,1569,1570,1572,1575,1577],{"class":43,"line":88},[41,1571,259],{"class":258},[41,1573,1574],{"class":262}," { User } ",[41,1576,266],{"class":258},[41,1578,1579],{"class":84}," '.\u002Fentities\u002Fuser.entity'\n",[41,1581,1582],{"class":43,"line":189},[41,1583,66],{"emptyLinePlaceholder":65},[41,1585,1586,1588,1590],{"class":43,"line":194},[41,1587,915],{"class":262},[41,1589,918],{"class":47},[41,1591,645],{"class":262},[41,1593,1594,1597,1600],{"class":43,"line":200},[41,1595,1596],{"class":262},"  imports: [TypeOrmModule.",[41,1598,1599],{"class":47},"forFeature",[41,1601,1602],{"class":262},"([User])],\n",[41,1604,1605],{"class":43,"line":211},[41,1606,1607],{"class":262},"  controllers: [UsersController],\n",[41,1609,1610],{"class":43,"line":216},[41,1611,1612],{"class":262},"  providers: [UsersService],\n",[41,1614,1615],{"class":43,"line":222},[41,1616,702],{"class":262},[41,1618,1619,1621,1623,1626],{"class":43,"line":229},[41,1620,634],{"class":258},[41,1622,1022],{"class":258},[41,1624,1625],{"class":47}," UsersModule",[41,1627,1028],{"class":262},[135,1629,1631],{"id":1630},"service実装","Service実装",[31,1633,1635],{"className":244,"code":1634,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fusers\u002Fusers.service.ts\nimport { Injectable, InternalServerErrorException } from '@nestjs\u002Fcommon'\nimport { InjectRepository } from '@nestjs\u002Ftypeorm'\nimport { Repository } from 'typeorm'\nimport { User } from '.\u002Fentities\u002Fuser.entity'\nimport { CreateUserDto } from '.\u002Fdto\u002Fcreate-user.dto'\nimport { UpdateUserDto } from '.\u002Fdto\u002Fupdate-user.dto'\n\n@Injectable()\nexport class UsersService {\n  constructor(\n    @InjectRepository(User)\n    private userRepository: Repository\u003CUser>,\n  ) {}\n\n  async create(createUserDto: CreateUserDto): Promise\u003C{ message: string }> {\n    await this.userRepository\n      .save({ name: createUserDto.name })\n      .catch((e) => {\n        throw new InternalServerErrorException(\n          `[${e.message}]アカウントの登録に失敗しました。`,\n        )\n      })\n\n    return { message: 'アカウントの登録に成功しました' }\n  }\n\n  async findAll(): Promise\u003CUser[]> {\n    return await this.userRepository.find()\n  }\n\n  async findOne(id: number): Promise\u003CUser> {\n    return await this.userRepository.findOneBy({ id })\n  }\n\n  async update(id: number, updateUserDto: UpdateUserDto): Promise\u003C{ message: string }> {\n    await this.userRepository\n      .update(id, { name: updateUserDto.name })\n      .catch((e) => {\n        throw new InternalServerErrorException(\n          `[${e.message}]アカウントID「${id}」の更新に失敗しました。`,\n        )\n      })\n\n    return { message: `アカウントID「${id}」の更新に成功しました。` }\n  }\n\n  async remove(id: number): Promise\u003C{ message: string }> {\n    await this.userRepository.delete(id).catch((e) => {\n      throw new InternalServerErrorException(\n        `[${e.message}]アカウントID「${id}」の削除に失敗しました。`,\n      )\n    })\n\n    return { message: `アカウントID「${id}」の削除に成功しました。` }\n  }\n}\n",[38,1636,1637,1642,1653,1664,1675,1685,1697,1709,1713,1722,1733,1740,1751,1773,1778,1782,1820,1831,1842,1862,1874,1891,1896,1902,1907,1922,1927,1932,1954,1971,1976,1981,2012,2029,2034,2039,2082,2091,2102,2119,2130,2151,2156,2161,2166,2183,2188,2193,2225,2252,2264,2285,2291,2297,2302,2318,2323],{"__ignoreMap":36},[41,1638,1639],{"class":43,"line":44},[41,1640,1641],{"class":58},"\u002F\u002F src\u002Fusers\u002Fusers.service.ts\n",[41,1643,1644,1646,1649,1651],{"class":43,"line":55},[41,1645,259],{"class":258},[41,1647,1648],{"class":262}," { Injectable, InternalServerErrorException } ",[41,1650,266],{"class":258},[41,1652,858],{"class":84},[41,1654,1655,1657,1660,1662],{"class":43,"line":62},[41,1656,259],{"class":258},[41,1658,1659],{"class":262}," { InjectRepository } ",[41,1661,266],{"class":258},[41,1663,870],{"class":84},[41,1665,1666,1668,1671,1673],{"class":43,"line":69},[41,1667,259],{"class":258},[41,1669,1670],{"class":262}," { Repository } ",[41,1672,266],{"class":258},[41,1674,625],{"class":84},[41,1676,1677,1679,1681,1683],{"class":43,"line":75},[41,1678,259],{"class":258},[41,1680,1574],{"class":262},[41,1682,266],{"class":258},[41,1684,1579],{"class":84},[41,1686,1687,1689,1692,1694],{"class":43,"line":88},[41,1688,259],{"class":258},[41,1690,1691],{"class":262}," { CreateUserDto } ",[41,1693,266],{"class":258},[41,1695,1696],{"class":84}," '.\u002Fdto\u002Fcreate-user.dto'\n",[41,1698,1699,1701,1704,1706],{"class":43,"line":189},[41,1700,259],{"class":258},[41,1702,1703],{"class":262}," { UpdateUserDto } ",[41,1705,266],{"class":258},[41,1707,1708],{"class":84}," '.\u002Fdto\u002Fupdate-user.dto'\n",[41,1710,1711],{"class":43,"line":194},[41,1712,66],{"emptyLinePlaceholder":65},[41,1714,1715,1717,1720],{"class":43,"line":200},[41,1716,915],{"class":262},[41,1718,1719],{"class":47},"Injectable",[41,1721,358],{"class":262},[41,1723,1724,1726,1728,1731],{"class":43,"line":211},[41,1725,634],{"class":258},[41,1727,1022],{"class":258},[41,1729,1730],{"class":47}," UsersService",[41,1732,1084],{"class":262},[41,1734,1735,1737],{"class":43,"line":216},[41,1736,1158],{"class":258},[41,1738,1739],{"class":262},"(\n",[41,1741,1742,1745,1748],{"class":43,"line":222},[41,1743,1744],{"class":262},"    @",[41,1746,1747],{"class":47},"InjectRepository",[41,1749,1750],{"class":262},"(User)\n",[41,1752,1753,1756,1759,1761,1764,1767,1770],{"class":43,"line":229},[41,1754,1755],{"class":258},"    private",[41,1757,1758],{"class":1109}," userRepository",[41,1760,81],{"class":258},[41,1762,1763],{"class":47}," Repository",[41,1765,1766],{"class":262},"\u003C",[41,1768,1769],{"class":47},"User",[41,1771,1772],{"class":262},">,\n",[41,1774,1775],{"class":43,"line":529},[41,1776,1777],{"class":262},"  ) {}\n",[41,1779,1780],{"class":43,"line":535},[41,1781,66],{"emptyLinePlaceholder":65},[41,1783,1784,1787,1790,1792,1795,1797,1799,1802,1804,1807,1810,1813,1815,1817],{"class":43,"line":541},[41,1785,1786],{"class":258},"  async",[41,1788,1789],{"class":47}," create",[41,1791,336],{"class":262},[41,1793,1794],{"class":1109},"createUserDto",[41,1796,81],{"class":258},[41,1798,1333],{"class":47},[41,1800,1801],{"class":262},")",[41,1803,81],{"class":258},[41,1805,1806],{"class":47}," Promise",[41,1808,1809],{"class":262},"\u003C{ ",[41,1811,1812],{"class":1109},"message",[41,1814,81],{"class":258},[41,1816,1168],{"class":51},[41,1818,1819],{"class":262}," }> {\n",[41,1821,1822,1825,1828],{"class":43,"line":988},[41,1823,1824],{"class":258},"    await",[41,1826,1827],{"class":51}," this",[41,1829,1830],{"class":262},".userRepository\n",[41,1832,1833,1836,1839],{"class":43,"line":994},[41,1834,1835],{"class":262},"      .",[41,1837,1838],{"class":47},"save",[41,1840,1841],{"class":262},"({ name: createUserDto.name })\n",[41,1843,1844,1846,1849,1852,1855,1857,1860],{"class":43,"line":1000},[41,1845,1835],{"class":262},[41,1847,1848],{"class":47},"catch",[41,1850,1851],{"class":262},"((",[41,1853,1854],{"class":1109},"e",[41,1856,342],{"class":262},[41,1858,1859],{"class":258},"=>",[41,1861,1084],{"class":262},[41,1863,1864,1867,1869,1872],{"class":43,"line":1006},[41,1865,1866],{"class":258},"        throw",[41,1868,205],{"class":258},[41,1870,1871],{"class":47}," InternalServerErrorException",[41,1873,1739],{"class":262},[41,1875,1876,1879,1881,1884,1886,1889],{"class":43,"line":1012},[41,1877,1878],{"class":84},"          `[${",[41,1880,1854],{"class":262},[41,1882,1883],{"class":84},".",[41,1885,1812],{"class":262},[41,1887,1888],{"class":84},"}]アカウントの登録に失敗しました。`",[41,1890,656],{"class":262},[41,1892,1893],{"class":43,"line":1017},[41,1894,1895],{"class":262},"        )\n",[41,1897,1899],{"class":43,"line":1898},23,[41,1900,1901],{"class":262},"      })\n",[41,1903,1905],{"class":43,"line":1904},24,[41,1906,66],{"emptyLinePlaceholder":65},[41,1908,1910,1913,1916,1919],{"class":43,"line":1909},25,[41,1911,1912],{"class":258},"    return",[41,1914,1915],{"class":262}," { message: ",[41,1917,1918],{"class":84},"'アカウントの登録に成功しました'",[41,1920,1921],{"class":262}," }\n",[41,1923,1925],{"class":43,"line":1924},26,[41,1926,815],{"class":262},[41,1928,1930],{"class":43,"line":1929},27,[41,1931,66],{"emptyLinePlaceholder":65},[41,1933,1935,1937,1940,1943,1945,1947,1949,1951],{"class":43,"line":1934},28,[41,1936,1786],{"class":258},[41,1938,1939],{"class":47}," findAll",[41,1941,1942],{"class":262},"()",[41,1944,81],{"class":258},[41,1946,1806],{"class":47},[41,1948,1766],{"class":262},[41,1950,1769],{"class":47},[41,1952,1953],{"class":262},"[]> {\n",[41,1955,1957,1959,1961,1963,1966,1969],{"class":43,"line":1956},29,[41,1958,1912],{"class":258},[41,1960,313],{"class":258},[41,1962,1827],{"class":51},[41,1964,1965],{"class":262},".userRepository.",[41,1967,1968],{"class":47},"find",[41,1970,358],{"class":262},[41,1972,1974],{"class":43,"line":1973},30,[41,1975,815],{"class":262},[41,1977,1979],{"class":43,"line":1978},31,[41,1980,66],{"emptyLinePlaceholder":65},[41,1982,1984,1986,1989,1991,1994,1996,1999,2001,2003,2005,2007,2009],{"class":43,"line":1983},32,[41,1985,1786],{"class":258},[41,1987,1988],{"class":47}," findOne",[41,1990,336],{"class":262},[41,1992,1993],{"class":1109},"id",[41,1995,81],{"class":258},[41,1997,1998],{"class":51}," number",[41,2000,1801],{"class":262},[41,2002,81],{"class":258},[41,2004,1806],{"class":47},[41,2006,1766],{"class":262},[41,2008,1769],{"class":47},[41,2010,2011],{"class":262},"> {\n",[41,2013,2015,2017,2019,2021,2023,2026],{"class":43,"line":2014},33,[41,2016,1912],{"class":258},[41,2018,313],{"class":258},[41,2020,1827],{"class":51},[41,2022,1965],{"class":262},[41,2024,2025],{"class":47},"findOneBy",[41,2027,2028],{"class":262},"({ id })\n",[41,2030,2032],{"class":43,"line":2031},34,[41,2033,815],{"class":262},[41,2035,2037],{"class":43,"line":2036},35,[41,2038,66],{"emptyLinePlaceholder":65},[41,2040,2042,2044,2047,2049,2051,2053,2055,2058,2061,2063,2066,2068,2070,2072,2074,2076,2078,2080],{"class":43,"line":2041},36,[41,2043,1786],{"class":258},[41,2045,2046],{"class":47}," update",[41,2048,336],{"class":262},[41,2050,1993],{"class":1109},[41,2052,81],{"class":258},[41,2054,1998],{"class":51},[41,2056,2057],{"class":262},", ",[41,2059,2060],{"class":1109},"updateUserDto",[41,2062,81],{"class":258},[41,2064,2065],{"class":47}," UpdateUserDto",[41,2067,1801],{"class":262},[41,2069,81],{"class":258},[41,2071,1806],{"class":47},[41,2073,1809],{"class":262},[41,2075,1812],{"class":1109},[41,2077,81],{"class":258},[41,2079,1168],{"class":51},[41,2081,1819],{"class":262},[41,2083,2085,2087,2089],{"class":43,"line":2084},37,[41,2086,1824],{"class":258},[41,2088,1827],{"class":51},[41,2090,1830],{"class":262},[41,2092,2094,2096,2099],{"class":43,"line":2093},38,[41,2095,1835],{"class":262},[41,2097,2098],{"class":47},"update",[41,2100,2101],{"class":262},"(id, { name: updateUserDto.name })\n",[41,2103,2105,2107,2109,2111,2113,2115,2117],{"class":43,"line":2104},39,[41,2106,1835],{"class":262},[41,2108,1848],{"class":47},[41,2110,1851],{"class":262},[41,2112,1854],{"class":1109},[41,2114,342],{"class":262},[41,2116,1859],{"class":258},[41,2118,1084],{"class":262},[41,2120,2122,2124,2126,2128],{"class":43,"line":2121},40,[41,2123,1866],{"class":258},[41,2125,205],{"class":258},[41,2127,1871],{"class":47},[41,2129,1739],{"class":262},[41,2131,2133,2135,2137,2139,2141,2144,2146,2149],{"class":43,"line":2132},41,[41,2134,1878],{"class":84},[41,2136,1854],{"class":262},[41,2138,1883],{"class":84},[41,2140,1812],{"class":262},[41,2142,2143],{"class":84},"}]アカウントID「${",[41,2145,1993],{"class":262},[41,2147,2148],{"class":84},"}」の更新に失敗しました。`",[41,2150,656],{"class":262},[41,2152,2154],{"class":43,"line":2153},42,[41,2155,1895],{"class":262},[41,2157,2159],{"class":43,"line":2158},43,[41,2160,1901],{"class":262},[41,2162,2164],{"class":43,"line":2163},44,[41,2165,66],{"emptyLinePlaceholder":65},[41,2167,2169,2171,2173,2176,2178,2181],{"class":43,"line":2168},45,[41,2170,1912],{"class":258},[41,2172,1915],{"class":262},[41,2174,2175],{"class":84},"`アカウントID「${",[41,2177,1993],{"class":262},[41,2179,2180],{"class":84},"}」の更新に成功しました。`",[41,2182,1921],{"class":262},[41,2184,2186],{"class":43,"line":2185},46,[41,2187,815],{"class":262},[41,2189,2191],{"class":43,"line":2190},47,[41,2192,66],{"emptyLinePlaceholder":65},[41,2194,2196,2198,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223],{"class":43,"line":2195},48,[41,2197,1786],{"class":258},[41,2199,2200],{"class":47}," remove",[41,2202,336],{"class":262},[41,2204,1993],{"class":1109},[41,2206,81],{"class":258},[41,2208,1998],{"class":51},[41,2210,1801],{"class":262},[41,2212,81],{"class":258},[41,2214,1806],{"class":47},[41,2216,1809],{"class":262},[41,2218,1812],{"class":1109},[41,2220,81],{"class":258},[41,2222,1168],{"class":51},[41,2224,1819],{"class":262},[41,2226,2228,2230,2232,2234,2237,2240,2242,2244,2246,2248,2250],{"class":43,"line":2227},49,[41,2229,1824],{"class":258},[41,2231,1827],{"class":51},[41,2233,1965],{"class":262},[41,2235,2236],{"class":47},"delete",[41,2238,2239],{"class":262},"(id).",[41,2241,1848],{"class":47},[41,2243,1851],{"class":262},[41,2245,1854],{"class":1109},[41,2247,342],{"class":262},[41,2249,1859],{"class":258},[41,2251,1084],{"class":262},[41,2253,2255,2258,2260,2262],{"class":43,"line":2254},50,[41,2256,2257],{"class":258},"      throw",[41,2259,205],{"class":258},[41,2261,1871],{"class":47},[41,2263,1739],{"class":262},[41,2265,2267,2270,2272,2274,2276,2278,2280,2283],{"class":43,"line":2266},51,[41,2268,2269],{"class":84},"        `[${",[41,2271,1854],{"class":262},[41,2273,1883],{"class":84},[41,2275,1812],{"class":262},[41,2277,2143],{"class":84},[41,2279,1993],{"class":262},[41,2281,2282],{"class":84},"}」の削除に失敗しました。`",[41,2284,656],{"class":262},[41,2286,2288],{"class":43,"line":2287},52,[41,2289,2290],{"class":262},"      )\n",[41,2292,2294],{"class":43,"line":2293},53,[41,2295,2296],{"class":262},"    })\n",[41,2298,2300],{"class":43,"line":2299},54,[41,2301,66],{"emptyLinePlaceholder":65},[41,2303,2305,2307,2309,2311,2313,2316],{"class":43,"line":2304},55,[41,2306,1912],{"class":258},[41,2308,1915],{"class":262},[41,2310,2175],{"class":84},[41,2312,1993],{"class":262},[41,2314,2315],{"class":84},"}」の削除に成功しました。`",[41,2317,1921],{"class":262},[41,2319,2321],{"class":43,"line":2320},56,[41,2322,815],{"class":262},[41,2324,2326],{"class":43,"line":2325},57,[41,2327,350],{"class":262},[135,2329,2331],{"id":2330},"controller実装","Controller実装",[31,2333,2335],{"className":244,"code":2334,"language":246,"meta":36,"style":36},"\u002F\u002F src\u002Fusers\u002Fusers.controller.ts\nimport {\n  Controller,\n  Get,\n  Post,\n  Body,\n  Patch,\n  Param,\n  Delete,\n} from '@nestjs\u002Fcommon'\nimport { UsersService } from '.\u002Fusers.service'\nimport { CreateUserDto } from '.\u002Fdto\u002Fcreate-user.dto'\nimport { UpdateUserDto } from '.\u002Fdto\u002Fupdate-user.dto'\nimport { User } from '.\u002Fentities\u002Fuser.entity'\n\n@Controller('users')\nexport class UsersController {\n  constructor(private readonly usersService: UsersService) {}\n\n  @Post()\n  async create(@Body() createUserDto: CreateUserDto): Promise\u003C{ message: string }> {\n    return await this.usersService.create(createUserDto)\n  }\n\n  @Get()\n  async findAll(): Promise\u003CUser[]> {\n    return await this.usersService.findAll()\n  }\n\n  @Get(':id')\n  async findOne(@Param('id') id: string): Promise\u003CUser> {\n    return await this.usersService.findOne(+id)\n  }\n\n  @Patch(':id')\n  async update(\n    @Param('id') id: string,\n    @Body() updateUserDto: UpdateUserDto,\n  ): Promise\u003C{ message: string }> {\n    return await this.usersService.update(+id, updateUserDto)\n  }\n\n  @Delete(':id')\n  async remove(@Param('id') id: string): Promise\u003C{ message: string }> {\n    return await this.usersService.remove(+id)\n  }\n}\n",[38,2336,2337,2342,2348,2353,2358,2363,2368,2373,2378,2383,2392,2402,2412,2422,2432,2436,2449,2460,2482,2486,2495,2532,2548,2552,2556,2565,2583,2598,2602,2606,2619,2655,2676,2680,2684,2697,2705,2725,2741,2760,2779,2783,2787,2800,2838,2857,2861],{"__ignoreMap":36},[41,2338,2339],{"class":43,"line":44},[41,2340,2341],{"class":58},"\u002F\u002F src\u002Fusers\u002Fusers.controller.ts\n",[41,2343,2344,2346],{"class":43,"line":55},[41,2345,259],{"class":258},[41,2347,1084],{"class":262},[41,2349,2350],{"class":43,"line":62},[41,2351,2352],{"class":262},"  Controller,\n",[41,2354,2355],{"class":43,"line":69},[41,2356,2357],{"class":262},"  Get,\n",[41,2359,2360],{"class":43,"line":75},[41,2361,2362],{"class":262},"  Post,\n",[41,2364,2365],{"class":43,"line":88},[41,2366,2367],{"class":262},"  Body,\n",[41,2369,2370],{"class":43,"line":189},[41,2371,2372],{"class":262},"  Patch,\n",[41,2374,2375],{"class":43,"line":194},[41,2376,2377],{"class":262},"  Param,\n",[41,2379,2380],{"class":43,"line":200},[41,2381,2382],{"class":262},"  Delete,\n",[41,2384,2385,2388,2390],{"class":43,"line":211},[41,2386,2387],{"class":262},"} ",[41,2389,266],{"class":258},[41,2391,858],{"class":84},[41,2393,2394,2396,2398,2400],{"class":43,"line":216},[41,2395,259],{"class":258},[41,2397,1550],{"class":262},[41,2399,266],{"class":258},[41,2401,1555],{"class":84},[41,2403,2404,2406,2408,2410],{"class":43,"line":222},[41,2405,259],{"class":258},[41,2407,1691],{"class":262},[41,2409,266],{"class":258},[41,2411,1696],{"class":84},[41,2413,2414,2416,2418,2420],{"class":43,"line":229},[41,2415,259],{"class":258},[41,2417,1703],{"class":262},[41,2419,266],{"class":258},[41,2421,1708],{"class":84},[41,2423,2424,2426,2428,2430],{"class":43,"line":529},[41,2425,259],{"class":258},[41,2427,1574],{"class":262},[41,2429,266],{"class":258},[41,2431,1579],{"class":84},[41,2433,2434],{"class":43,"line":535},[41,2435,66],{"emptyLinePlaceholder":65},[41,2437,2438,2440,2443,2445,2447],{"class":43,"line":541},[41,2439,915],{"class":262},[41,2441,2442],{"class":47},"Controller",[41,2444,336],{"class":262},[41,2446,1069],{"class":84},[41,2448,1072],{"class":262},[41,2450,2451,2453,2455,2458],{"class":43,"line":988},[41,2452,634],{"class":258},[41,2454,1022],{"class":258},[41,2456,2457],{"class":47}," UsersController",[41,2459,1084],{"class":262},[41,2461,2462,2464,2466,2469,2472,2475,2477,2479],{"class":43,"line":994},[41,2463,1158],{"class":258},[41,2465,336],{"class":262},[41,2467,2468],{"class":258},"private",[41,2470,2471],{"class":258}," readonly",[41,2473,2474],{"class":1109}," usersService",[41,2476,81],{"class":258},[41,2478,1730],{"class":47},[41,2480,2481],{"class":262},") {}\n",[41,2483,2484],{"class":43,"line":1000},[41,2485,66],{"emptyLinePlaceholder":65},[41,2487,2488,2490,2493],{"class":43,"line":1006},[41,2489,1089],{"class":262},[41,2491,2492],{"class":47},"Post",[41,2494,358],{"class":262},[41,2496,2497,2499,2501,2504,2507,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530],{"class":43,"line":1012},[41,2498,1786],{"class":258},[41,2500,1789],{"class":47},[41,2502,2503],{"class":262},"(@",[41,2505,2506],{"class":47},"Body",[41,2508,2509],{"class":262},"() ",[41,2511,1794],{"class":1109},[41,2513,81],{"class":258},[41,2515,1333],{"class":47},[41,2517,1801],{"class":262},[41,2519,81],{"class":258},[41,2521,1806],{"class":47},[41,2523,1809],{"class":262},[41,2525,1812],{"class":1109},[41,2527,81],{"class":258},[41,2529,1168],{"class":51},[41,2531,1819],{"class":262},[41,2533,2534,2536,2538,2540,2543,2545],{"class":43,"line":1017},[41,2535,1912],{"class":258},[41,2537,313],{"class":258},[41,2539,1827],{"class":51},[41,2541,2542],{"class":262},".usersService.",[41,2544,319],{"class":47},[41,2546,2547],{"class":262},"(createUserDto)\n",[41,2549,2550],{"class":43,"line":1898},[41,2551,815],{"class":262},[41,2553,2554],{"class":43,"line":1904},[41,2555,66],{"emptyLinePlaceholder":65},[41,2557,2558,2560,2563],{"class":43,"line":1909},[41,2559,1089],{"class":262},[41,2561,2562],{"class":47},"Get",[41,2564,358],{"class":262},[41,2566,2567,2569,2571,2573,2575,2577,2579,2581],{"class":43,"line":1924},[41,2568,1786],{"class":258},[41,2570,1939],{"class":47},[41,2572,1942],{"class":262},[41,2574,81],{"class":258},[41,2576,1806],{"class":47},[41,2578,1766],{"class":262},[41,2580,1769],{"class":47},[41,2582,1953],{"class":262},[41,2584,2585,2587,2589,2591,2593,2596],{"class":43,"line":1929},[41,2586,1912],{"class":258},[41,2588,313],{"class":258},[41,2590,1827],{"class":51},[41,2592,2542],{"class":262},[41,2594,2595],{"class":47},"findAll",[41,2597,358],{"class":262},[41,2599,2600],{"class":43,"line":1934},[41,2601,815],{"class":262},[41,2603,2604],{"class":43,"line":1956},[41,2605,66],{"emptyLinePlaceholder":65},[41,2607,2608,2610,2612,2614,2617],{"class":43,"line":1973},[41,2609,1089],{"class":262},[41,2611,2562],{"class":47},[41,2613,336],{"class":262},[41,2615,2616],{"class":84},"':id'",[41,2618,1072],{"class":262},[41,2620,2621,2623,2625,2627,2630,2632,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653],{"class":43,"line":1978},[41,2622,1786],{"class":258},[41,2624,1988],{"class":47},[41,2626,2503],{"class":262},[41,2628,2629],{"class":47},"Param",[41,2631,336],{"class":262},[41,2633,2634],{"class":84},"'id'",[41,2636,342],{"class":262},[41,2638,1993],{"class":1109},[41,2640,81],{"class":258},[41,2642,1168],{"class":51},[41,2644,1801],{"class":262},[41,2646,81],{"class":258},[41,2648,1806],{"class":47},[41,2650,1766],{"class":262},[41,2652,1769],{"class":47},[41,2654,2011],{"class":262},[41,2656,2657,2659,2661,2663,2665,2668,2670,2673],{"class":43,"line":1983},[41,2658,1912],{"class":258},[41,2660,313],{"class":258},[41,2662,1827],{"class":51},[41,2664,2542],{"class":262},[41,2666,2667],{"class":47},"findOne",[41,2669,336],{"class":262},[41,2671,2672],{"class":258},"+",[41,2674,2675],{"class":262},"id)\n",[41,2677,2678],{"class":43,"line":2014},[41,2679,815],{"class":262},[41,2681,2682],{"class":43,"line":2031},[41,2683,66],{"emptyLinePlaceholder":65},[41,2685,2686,2688,2691,2693,2695],{"class":43,"line":2036},[41,2687,1089],{"class":262},[41,2689,2690],{"class":47},"Patch",[41,2692,336],{"class":262},[41,2694,2616],{"class":84},[41,2696,1072],{"class":262},[41,2698,2699,2701,2703],{"class":43,"line":2041},[41,2700,1786],{"class":258},[41,2702,2046],{"class":47},[41,2704,1739],{"class":262},[41,2706,2707,2709,2711,2713,2715,2717,2719,2721,2723],{"class":43,"line":2084},[41,2708,1744],{"class":262},[41,2710,2629],{"class":47},[41,2712,336],{"class":262},[41,2714,2634],{"class":84},[41,2716,342],{"class":262},[41,2718,1993],{"class":1109},[41,2720,81],{"class":258},[41,2722,1168],{"class":51},[41,2724,656],{"class":262},[41,2726,2727,2729,2731,2733,2735,2737,2739],{"class":43,"line":2093},[41,2728,1744],{"class":262},[41,2730,2506],{"class":47},[41,2732,2509],{"class":262},[41,2734,2060],{"class":1109},[41,2736,81],{"class":258},[41,2738,2065],{"class":47},[41,2740,656],{"class":262},[41,2742,2743,2746,2748,2750,2752,2754,2756,2758],{"class":43,"line":2104},[41,2744,2745],{"class":262},"  )",[41,2747,81],{"class":258},[41,2749,1806],{"class":47},[41,2751,1809],{"class":262},[41,2753,1812],{"class":1109},[41,2755,81],{"class":258},[41,2757,1168],{"class":51},[41,2759,1819],{"class":262},[41,2761,2762,2764,2766,2768,2770,2772,2774,2776],{"class":43,"line":2121},[41,2763,1912],{"class":258},[41,2765,313],{"class":258},[41,2767,1827],{"class":51},[41,2769,2542],{"class":262},[41,2771,2098],{"class":47},[41,2773,336],{"class":262},[41,2775,2672],{"class":258},[41,2777,2778],{"class":262},"id, updateUserDto)\n",[41,2780,2781],{"class":43,"line":2132},[41,2782,815],{"class":262},[41,2784,2785],{"class":43,"line":2153},[41,2786,66],{"emptyLinePlaceholder":65},[41,2788,2789,2791,2794,2796,2798],{"class":43,"line":2158},[41,2790,1089],{"class":262},[41,2792,2793],{"class":47},"Delete",[41,2795,336],{"class":262},[41,2797,2616],{"class":84},[41,2799,1072],{"class":262},[41,2801,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836],{"class":43,"line":2163},[41,2803,1786],{"class":258},[41,2805,2200],{"class":47},[41,2807,2503],{"class":262},[41,2809,2629],{"class":47},[41,2811,336],{"class":262},[41,2813,2634],{"class":84},[41,2815,342],{"class":262},[41,2817,1993],{"class":1109},[41,2819,81],{"class":258},[41,2821,1168],{"class":51},[41,2823,1801],{"class":262},[41,2825,81],{"class":258},[41,2827,1806],{"class":47},[41,2829,1809],{"class":262},[41,2831,1812],{"class":1109},[41,2833,81],{"class":258},[41,2835,1168],{"class":51},[41,2837,1819],{"class":262},[41,2839,2840,2842,2844,2846,2848,2851,2853,2855],{"class":43,"line":2168},[41,2841,1912],{"class":258},[41,2843,313],{"class":258},[41,2845,1827],{"class":51},[41,2847,2542],{"class":262},[41,2849,2850],{"class":47},"remove",[41,2852,336],{"class":262},[41,2854,2672],{"class":258},[41,2856,2675],{"class":262},[41,2858,2859],{"class":43,"line":2185},[41,2860,815],{"class":262},[41,2862,2863],{"class":43,"line":2190},[41,2864,350],{"class":262},[10,2866,2868],{"id":2867},"apiのテスト","APIのテスト",[135,2870,2871],{"id":2871},"登録",[31,2873,2875],{"className":33,"code":2874,"language":35,"meta":36,"style":36},"curl -X POST -H \"Content-Type:application\u002Fjson\" \\\n  http:\u002F\u002Flocalhost:3001\u002Fusers \\\n  -d '{\"name\":\"サンプル太郎\"}'\n\n# {\"message\":\"アカウントの登録に成功しました\"}\n",[38,2876,2877,2896,2903,2911,2915],{"__ignoreMap":36},[41,2878,2879,2881,2884,2887,2890,2893],{"class":43,"line":44},[41,2880,408],{"class":47},[41,2882,2883],{"class":51}," -X",[41,2885,2886],{"class":84}," POST",[41,2888,2889],{"class":51}," -H",[41,2891,2892],{"class":84}," \"Content-Type:application\u002Fjson\"",[41,2894,2895],{"class":51}," \\\n",[41,2897,2898,2901],{"class":43,"line":55},[41,2899,2900],{"class":84},"  http:\u002F\u002Flocalhost:3001\u002Fusers",[41,2902,2895],{"class":51},[41,2904,2905,2908],{"class":43,"line":62},[41,2906,2907],{"class":51},"  -d",[41,2909,2910],{"class":84}," '{\"name\":\"サンプル太郎\"}'\n",[41,2912,2913],{"class":43,"line":69},[41,2914,66],{"emptyLinePlaceholder":65},[41,2916,2917],{"class":43,"line":75},[41,2918,2919],{"class":58},"# {\"message\":\"アカウントの登録に成功しました\"}\n",[135,2921,2922],{"id":2922},"全件取得",[31,2924,2926],{"className":33,"code":2925,"language":35,"meta":36,"style":36},"curl http:\u002F\u002Flocalhost:3001\u002Fusers\n\n# [{\"name\":\"サンプル太郎\",\"id\":1}]\n",[38,2927,2928,2935,2939],{"__ignoreMap":36},[41,2929,2930,2932],{"class":43,"line":44},[41,2931,408],{"class":47},[41,2933,2934],{"class":84}," http:\u002F\u002Flocalhost:3001\u002Fusers\n",[41,2936,2937],{"class":43,"line":55},[41,2938,66],{"emptyLinePlaceholder":65},[41,2940,2941],{"class":43,"line":62},[41,2942,2943],{"class":58},"# [{\"name\":\"サンプル太郎\",\"id\":1}]\n",[135,2945,2946],{"id":2946},"更新",[31,2948,2950],{"className":33,"code":2949,"language":35,"meta":36,"style":36},"curl -X PATCH -H \"Content-Type:application\u002Fjson\" \\\n  http:\u002F\u002Flocalhost:3001\u002Fusers\u002F1 \\\n  -d '{\"name\":\"更新したよ\"}'\n\n# {\"message\":\"アカウントID「1」の更新に成功しました。\"}\n",[38,2951,2952,2967,2974,2981,2985],{"__ignoreMap":36},[41,2953,2954,2956,2958,2961,2963,2965],{"class":43,"line":44},[41,2955,408],{"class":47},[41,2957,2883],{"class":51},[41,2959,2960],{"class":84}," PATCH",[41,2962,2889],{"class":51},[41,2964,2892],{"class":84},[41,2966,2895],{"class":51},[41,2968,2969,2972],{"class":43,"line":55},[41,2970,2971],{"class":84},"  http:\u002F\u002Flocalhost:3001\u002Fusers\u002F1",[41,2973,2895],{"class":51},[41,2975,2976,2978],{"class":43,"line":62},[41,2977,2907],{"class":51},[41,2979,2980],{"class":84}," '{\"name\":\"更新したよ\"}'\n",[41,2982,2983],{"class":43,"line":69},[41,2984,66],{"emptyLinePlaceholder":65},[41,2986,2987],{"class":43,"line":75},[41,2988,2989],{"class":58},"# {\"message\":\"アカウントID「1」の更新に成功しました。\"}\n",[135,2991,2992],{"id":2992},"個別取得",[31,2994,2996],{"className":33,"code":2995,"language":35,"meta":36,"style":36},"curl http:\u002F\u002Flocalhost:3001\u002Fusers\u002F1\n\n# {\"name\":\"更新したよ\",\"id\":1}\n",[38,2997,2998,3005,3009],{"__ignoreMap":36},[41,2999,3000,3002],{"class":43,"line":44},[41,3001,408],{"class":47},[41,3003,3004],{"class":84}," http:\u002F\u002Flocalhost:3001\u002Fusers\u002F1\n",[41,3006,3007],{"class":43,"line":55},[41,3008,66],{"emptyLinePlaceholder":65},[41,3010,3011],{"class":43,"line":62},[41,3012,3013],{"class":58},"# {\"name\":\"更新したよ\",\"id\":1}\n",[135,3015,3016],{"id":3016},"削除",[31,3018,3020],{"className":33,"code":3019,"language":35,"meta":36,"style":36},"curl -X DELETE http:\u002F\u002Flocalhost:3001\u002Fusers\u002F1\n\n# {\"message\":\"アカウントID「1」の削除に成功しました。\"}\n",[38,3021,3022,3033,3037],{"__ignoreMap":36},[41,3023,3024,3026,3028,3031],{"class":43,"line":44},[41,3025,408],{"class":47},[41,3027,2883],{"class":51},[41,3029,3030],{"class":84}," DELETE",[41,3032,3004],{"class":84},[41,3034,3035],{"class":43,"line":55},[41,3036,66],{"emptyLinePlaceholder":65},[41,3038,3039],{"class":43,"line":62},[41,3040,3041],{"class":58},"# {\"message\":\"アカウントID「1」の削除に成功しました。\"}\n",[10,3043,3044],{"id":3044},"まとめ",[14,3046,3047],{},"NestJS V.9とTypeORM 0.3を使った、最新のREST API構築方法を解説しました。",[14,3049,3050],{},[601,3051,3052],{},"実装したもの：",[116,3054,3055,3058,3061,3064],{},[119,3056,3057],{},"TypeORMを使ったEntity定義",[119,3059,3060],{},"マイグレーション管理",[119,3062,3063],{},"class-validatorを使ったバリデーション",[119,3065,3066],{},"CRUD操作の完全実装",[14,3068,3069],{},[601,3070,3071],{},"重要なポイント：",[116,3073,3074,3077,3080,3083],{},[119,3075,3076],{},"TypeORM 0.3系では、Repository APIが変更されている",[119,3078,3079],{},"本番環境では環境変数で設定を管理",[119,3081,3082],{},"グローバルバリデーションで一貫したエラーハンドリング",[119,3084,3085],{},"マイグレーションでスキーマをバージョン管理",[14,3087,3088],{},"この実装パターンは、スケーラブルなAPIの基礎として活用できます。",[3090,3091,3092],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":36,"searchDepth":55,"depth":55,"links":3094},[3095,3096,3097,3098,3103,3104,3110,3111,3115,3120,3125,3132],{"id":12,"depth":55,"text":12},{"id":29,"depth":55,"text":29},{"id":102,"depth":55,"text":103},{"id":133,"depth":55,"text":133,"children":3099},[3100,3101,3102],{"id":137,"depth":62,"text":138},{"id":237,"depth":62,"text":238},{"id":361,"depth":62,"text":361},{"id":419,"depth":55,"text":420},{"id":555,"depth":55,"text":556,"children":3105},[3106,3107,3108,3109],{"id":559,"depth":62,"text":559},{"id":596,"depth":62,"text":597},{"id":713,"depth":62,"text":714},{"id":835,"depth":62,"text":836},{"id":1031,"depth":55,"text":1032},{"id":1203,"depth":55,"text":1203,"children":3112},[3113,3114],{"id":1206,"depth":62,"text":1206},{"id":1235,"depth":62,"text":1235},{"id":1272,"depth":55,"text":1272,"children":3116},[3117,3118,3119],{"id":1275,"depth":62,"text":559},{"id":1297,"depth":62,"text":1298},{"id":1385,"depth":62,"text":1385},{"id":1508,"depth":55,"text":1509,"children":3121},[3122,3123,3124],{"id":1512,"depth":62,"text":1513},{"id":1630,"depth":62,"text":1631},{"id":2330,"depth":62,"text":2331},{"id":2867,"depth":55,"text":2868,"children":3126},[3127,3128,3129,3130,3131],{"id":2871,"depth":62,"text":2871},{"id":2922,"depth":62,"text":2922},{"id":2946,"depth":62,"text":2946},{"id":2992,"depth":62,"text":2992},{"id":3016,"depth":62,"text":3016},{"id":3044,"depth":55,"text":3044},"2021-12-19","NestJS V.9とTypeORM 0.3を使った最新のREST API構築方法を解説します。マイグレーション管理、バリデーション、CRUD操作の実装を含む実践的なガイドです。","md",{"tags":3137},[246,3138,3139,3140],"nestjs","typeorm","api","\u002Fblog\u002Fnestjs-typeorm-crud-implementation",{"title":5,"description":3134},"blog\u002Fnestjs-typeorm-crud-implementation","ecXoiZerzL-q8syvb0omwfHgIX7qlaHxA2SB5NKGYCk",1773664054184]