[{"data":1,"prerenderedAt":4227},["ShallowReactive",2],{"article-fr-\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers":3,"article-sibling-fr-\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers":2285,"surround-fr-\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers":4202,"related-fr-\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers":4209},{"id":4,"title":5,"body":6,"date":2268,"description":2269,"extension":2270,"img":2271,"meta":2272,"navigation":353,"path":2273,"seo":2274,"slug":2275,"stem":2276,"tags":2277,"topics":2281,"__hash__":2284},"content\u002F2.backend\u002F1.nest-js\u002F2.understanding-services-modules-and-controllers.fr.md","Maîtriser NestJS : comprendre Services, Modules et Contrôleurs",{"type":7,"value":8,"toc":2254},"minimark",[9,14,18,33,37,45,48,78,83,96,107,110,114,120,123,231,235,238,1042,1045,1079,1084,1087,1092,1095,1165,1169,1172,1257,1261,1268,1271,1806,1824,1828,1846,1850,1857,1867,1871,1881,1888,1891,2019,2025,2051,2057,2218,2221,2225,2237,2241,2244,2247,2250],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17],"p",{},"Dans un précédent article, on t'a introduit à NestJS, un framework moderne basé sur TypeScript\net Node.js, qui apporte structure et efficacité à tes projets backend. Dans cette série, on\nplonge plus profondément dans les fonctionnalités et concepts clés de NestJS. Tu auras une\ncompréhension complète des modules, contrôleurs, routes, providers, services, gestion des\nexceptions et validation, à travers un projet qui consistera à implémenter le CRUD (Create,\nRead, Update, Delete) de produits d'un catalogue e-commerce.",[19,20,21],"blockquote",{},[15,22,23,24,32],{},"J'ai créé un dépôt GitHub pour cette série, accessible à l'\n",[25,26,31],"a",{"href":27,"rel":28,"title":30},"https:\u002F\u002Fgithub.com\u002Fdenisakp\u002Fawesome-nest-js",[29],"nofollow","Projet awesome nest-js","adresse suivante",".",[10,34,36],{"id":35},"ressource-crud","Ressource CRUD",[15,38,39,40,44],{},"Puisqu'on s'apprête à créer une ressource ",[41,42,43],"strong",{},"Product",", le plus direct est de lancer une seule\ncommande qui va générer une nouvelle ressource CRUD : un module, un contrôleur pour définir les\nroutes CRUD, un service pour implémenter et isoler la logique métier, une classe\u002Finterface\nentité pour représenter la forme des données, et des DTO pour définir comment les données seront\néchangées sur le réseau.",[15,46,47],{},"Créons notre première ressource CRUD avec la commande CLI suivante :",[49,50,56],"pre",{"className":51,"code":52,"filename":53,"language":54,"meta":55,"style":55},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight"," nest g resource products\n","bash","shell","",[57,58,59],"code",{"__ignoreMap":55},[60,61,64,68,72,75],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"sBMFI"," nest",[60,69,71],{"class":70},"sfazB"," g",[60,73,74],{"class":70}," resource",[60,76,77],{"class":70}," products\n",[79,80],"post-image",{"alt":81,"source":82},"Création d'une ressource Nest","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fnest-js\u002F2-nestjs-service-module-controller\u002Fqdb3zfftoywnt71vjbp9",[19,84,85],{},[15,86,87,88,91,92,95],{},"Sur la capture suivante, remarque qu'on utilise ",[41,89,90],{},"REST API"," comme couche de transport et qu'on\nrépond ",[41,93,94],{},"Y"," quand on nous demande si on veut générer les points d'entrée CRUD.",[15,97,98,99,102,103,106],{},"Si tout se passe bien, tu remarqueras un nouveau dossier nommé ",[41,100,101],{},"products"," et que ton fichier\n",[41,104,105],{},"app.module.ts"," a aussi changé. On va explorer tout ça dans les sections suivantes.",[79,108],{"alt":81,"source":109},"https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fnest-js\u002F2-nestjs-service-module-controller\u002Fv4txbgejqiwbuxfbc6vx",[10,111,113],{"id":112},"entité","Entité",[15,115,116,117,119],{},"Le rôle d'une ",[41,118,112],{}," dans NestJS est de définir la structure et le schéma de tes modèles de\ndonnées, principalement pour les interactions avec la base de données. Dans un projet réel,\ncette classe sera manipulée via un ORM comme Prisma, MikroORM, TypeORM…, mais pour l'instant on\nn'entre pas dans ces détails.",[15,121,122],{},"Voici à quoi ressemble notre entité produit :",[49,124,129],{"className":125,"code":126,"filename":127,"language":128,"meta":55,"style":55},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export class Product {\n  id: number;\n  name: string;\n  description: string;\n  category: string;\n  price: number;\n  image: string;\n}\n","product.entity.ts","ts",[57,130,131,148,164,177,189,201,213,225],{"__ignoreMap":55},[60,132,133,137,141,144],{"class":62,"line":63},[60,134,136],{"class":135},"s7zQu","export",[60,138,140],{"class":139},"spNyl"," class",[60,142,143],{"class":66}," Product",[60,145,147],{"class":146},"sMK4o"," {\n",[60,149,151,155,158,161],{"class":62,"line":150},2,[60,152,154],{"class":153},"swJcz","  id",[60,156,157],{"class":146},":",[60,159,160],{"class":66}," number",[60,162,163],{"class":146},";\n",[60,165,167,170,172,175],{"class":62,"line":166},3,[60,168,169],{"class":153},"  name",[60,171,157],{"class":146},[60,173,174],{"class":66}," string",[60,176,163],{"class":146},[60,178,180,183,185,187],{"class":62,"line":179},4,[60,181,182],{"class":153},"  description",[60,184,157],{"class":146},[60,186,174],{"class":66},[60,188,163],{"class":146},[60,190,192,195,197,199],{"class":62,"line":191},5,[60,193,194],{"class":153},"  category",[60,196,157],{"class":146},[60,198,174],{"class":66},[60,200,163],{"class":146},[60,202,204,207,209,211],{"class":62,"line":203},6,[60,205,206],{"class":153},"  price",[60,208,157],{"class":146},[60,210,160],{"class":66},[60,212,163],{"class":146},[60,214,216,219,221,223],{"class":62,"line":215},7,[60,217,218],{"class":153},"  image",[60,220,157],{"class":146},[60,222,174],{"class":66},[60,224,163],{"class":146},[60,226,228],{"class":62,"line":227},8,[60,229,230],{"class":146},"}\n",[10,232,234],{"id":233},"service","Service",[15,236,237],{},"Dans un projet NestJS, les services permettent de séparer la logique de ton application en\nunités réutilisables et testables. Cette séparation des préoccupations favorise la\nmaintenabilité du code et facilite la collaboration sur des projets plus larges.",[49,239,242],{"className":125,"code":240,"filename":241,"language":128,"meta":55,"style":55},"import { HttpException, HttpStatus, Injectable } from '@nestjs\u002Fcommon';\nimport { CreateProductDto } from '.\u002Fdto\u002Fcreate-product.dto';\nimport { UpdateProductDto } from '.\u002Fdto\u002Fupdate-product.dto';\nimport { Product } from '.\u002Fentities\u002Fproduct.entity';\n\n@Injectable()\nexport class ProductsService {\n  private lastProductId = 0;\n  private products = [];\n\n  create(createProductDto: CreateProductDto): Product {\n    const newProduct = { id: ++this.lastProductId, ...createProductDto };\n    this.products.push(newProduct);\n    return newProduct;\n  }\n\n  findAll(): Product[] {\n    return this.products;\n  }\n\n  findOne(id: number) {\n    const product = this.products.find((product) => product.id === id);\n    if (product) {\n      return product;\n    }\n    throw new HttpException('Product not found', HttpStatus.NOT_FOUND);\n  }\n\n  update(id: number, updateProductDto: UpdateProductDto) {\n    const productIndex = this.products.findIndex(\n      (product) => product.id === id,\n    );\n\n    if (productIndex > -1) {\n      this.products[productIndex] = updateProductDto;\n      return updateProductDto;\n    }\n    throw new HttpException('Product not found', HttpStatus.NOT_FOUND);\n  }\n\n  remove(id: number) {\n    const productIndex = this.products.findIndex(\n      (product) => product.id === id,\n    );\n\n    if (productIndex > -1) {\n      this.products.splice(productIndex, 1);\n    }\n    throw new HttpException('Product not found', HttpStatus.NOT_FOUND);\n  }\n}\n\n","product.service.ts",[57,243,244,284,306,328,349,355,367,378,395,410,415,439,473,496,506,512,517,534,546,551,556,575,621,637,647,653,686,691,696,723,745,770,778,783,806,829,838,843,872,877,882,900,919,942,949,954,973,998,1003,1032,1037],{"__ignoreMap":55},[60,245,246,249,252,256,259,262,264,267,270,273,276,279,282],{"class":62,"line":63},[60,247,248],{"class":135},"import",[60,250,251],{"class":146}," {",[60,253,255],{"class":254},"sTEyZ"," HttpException",[60,257,258],{"class":146},",",[60,260,261],{"class":254}," HttpStatus",[60,263,258],{"class":146},[60,265,266],{"class":254}," Injectable",[60,268,269],{"class":146}," }",[60,271,272],{"class":135}," from",[60,274,275],{"class":146}," '",[60,277,278],{"class":70},"@nestjs\u002Fcommon",[60,280,281],{"class":146},"'",[60,283,163],{"class":146},[60,285,286,288,290,293,295,297,299,302,304],{"class":62,"line":150},[60,287,248],{"class":135},[60,289,251],{"class":146},[60,291,292],{"class":254}," CreateProductDto",[60,294,269],{"class":146},[60,296,272],{"class":135},[60,298,275],{"class":146},[60,300,301],{"class":70},".\u002Fdto\u002Fcreate-product.dto",[60,303,281],{"class":146},[60,305,163],{"class":146},[60,307,308,310,312,315,317,319,321,324,326],{"class":62,"line":166},[60,309,248],{"class":135},[60,311,251],{"class":146},[60,313,314],{"class":254}," UpdateProductDto",[60,316,269],{"class":146},[60,318,272],{"class":135},[60,320,275],{"class":146},[60,322,323],{"class":70},".\u002Fdto\u002Fupdate-product.dto",[60,325,281],{"class":146},[60,327,163],{"class":146},[60,329,330,332,334,336,338,340,342,345,347],{"class":62,"line":179},[60,331,248],{"class":135},[60,333,251],{"class":146},[60,335,143],{"class":254},[60,337,269],{"class":146},[60,339,272],{"class":135},[60,341,275],{"class":146},[60,343,344],{"class":70},".\u002Fentities\u002Fproduct.entity",[60,346,281],{"class":146},[60,348,163],{"class":146},[60,350,351],{"class":62,"line":191},[60,352,354],{"emptyLinePlaceholder":353},true,"\n",[60,356,357,360,364],{"class":62,"line":203},[60,358,359],{"class":146},"@",[60,361,363],{"class":362},"s2Zo4","Injectable",[60,365,366],{"class":254},"()\n",[60,368,369,371,373,376],{"class":62,"line":215},[60,370,136],{"class":135},[60,372,140],{"class":139},[60,374,375],{"class":66}," ProductsService",[60,377,147],{"class":146},[60,379,380,383,386,389,393],{"class":62,"line":227},[60,381,382],{"class":139},"  private",[60,384,385],{"class":153}," lastProductId",[60,387,388],{"class":146}," =",[60,390,392],{"class":391},"sbssI"," 0",[60,394,163],{"class":146},[60,396,398,400,403,405,408],{"class":62,"line":397},9,[60,399,382],{"class":139},[60,401,402],{"class":153}," products",[60,404,388],{"class":146},[60,406,407],{"class":254}," []",[60,409,163],{"class":146},[60,411,413],{"class":62,"line":412},10,[60,414,354],{"emptyLinePlaceholder":353},[60,416,418,421,424,428,430,432,435,437],{"class":62,"line":417},11,[60,419,420],{"class":153},"  create",[60,422,423],{"class":146},"(",[60,425,427],{"class":426},"sHdIc","createProductDto",[60,429,157],{"class":146},[60,431,292],{"class":66},[60,433,434],{"class":146},"):",[60,436,143],{"class":66},[60,438,147],{"class":146},[60,440,442,445,448,450,452,455,457,460,463,465,468,470],{"class":62,"line":441},12,[60,443,444],{"class":139},"    const",[60,446,447],{"class":254}," newProduct",[60,449,388],{"class":146},[60,451,251],{"class":146},[60,453,454],{"class":153}," id",[60,456,157],{"class":146},[60,458,459],{"class":146}," ++this.",[60,461,462],{"class":254},"lastProductId",[60,464,258],{"class":146},[60,466,467],{"class":146}," ...",[60,469,427],{"class":254},[60,471,472],{"class":146}," };\n",[60,474,476,479,481,483,486,488,491,494],{"class":62,"line":475},13,[60,477,478],{"class":146},"    this.",[60,480,101],{"class":254},[60,482,32],{"class":146},[60,484,485],{"class":362},"push",[60,487,423],{"class":153},[60,489,490],{"class":254},"newProduct",[60,492,493],{"class":153},")",[60,495,163],{"class":146},[60,497,499,502,504],{"class":62,"line":498},14,[60,500,501],{"class":135},"    return",[60,503,447],{"class":254},[60,505,163],{"class":146},[60,507,509],{"class":62,"line":508},15,[60,510,511],{"class":146},"  }\n",[60,513,515],{"class":62,"line":514},16,[60,516,354],{"emptyLinePlaceholder":353},[60,518,520,523,526,528,531],{"class":62,"line":519},17,[60,521,522],{"class":153},"  findAll",[60,524,525],{"class":146},"():",[60,527,143],{"class":66},[60,529,530],{"class":254},"[] ",[60,532,533],{"class":146},"{\n",[60,535,537,539,542,544],{"class":62,"line":536},18,[60,538,501],{"class":135},[60,540,541],{"class":146}," this.",[60,543,101],{"class":254},[60,545,163],{"class":146},[60,547,549],{"class":62,"line":548},19,[60,550,511],{"class":146},[60,552,554],{"class":62,"line":553},20,[60,555,354],{"emptyLinePlaceholder":353},[60,557,559,562,564,567,569,571,573],{"class":62,"line":558},21,[60,560,561],{"class":153},"  findOne",[60,563,423],{"class":146},[60,565,566],{"class":426},"id",[60,568,157],{"class":146},[60,570,160],{"class":66},[60,572,493],{"class":146},[60,574,147],{"class":146},[60,576,578,580,583,585,587,589,591,594,596,598,601,603,606,608,610,612,615,617,619],{"class":62,"line":577},22,[60,579,444],{"class":139},[60,581,582],{"class":254}," product",[60,584,388],{"class":146},[60,586,541],{"class":146},[60,588,101],{"class":254},[60,590,32],{"class":146},[60,592,593],{"class":362},"find",[60,595,423],{"class":153},[60,597,423],{"class":146},[60,599,600],{"class":426},"product",[60,602,493],{"class":146},[60,604,605],{"class":139}," =>",[60,607,582],{"class":254},[60,609,32],{"class":146},[60,611,566],{"class":254},[60,613,614],{"class":146}," ===",[60,616,454],{"class":254},[60,618,493],{"class":153},[60,620,163],{"class":146},[60,622,624,627,630,632,635],{"class":62,"line":623},23,[60,625,626],{"class":135},"    if",[60,628,629],{"class":153}," (",[60,631,600],{"class":254},[60,633,634],{"class":153},") ",[60,636,533],{"class":146},[60,638,640,643,645],{"class":62,"line":639},24,[60,641,642],{"class":135},"      return",[60,644,582],{"class":254},[60,646,163],{"class":146},[60,648,650],{"class":62,"line":649},25,[60,651,652],{"class":146},"    }\n",[60,654,656,659,662,664,666,668,671,673,675,677,679,682,684],{"class":62,"line":655},26,[60,657,658],{"class":135},"    throw",[60,660,661],{"class":146}," new",[60,663,255],{"class":362},[60,665,423],{"class":153},[60,667,281],{"class":146},[60,669,670],{"class":70},"Product not found",[60,672,281],{"class":146},[60,674,258],{"class":146},[60,676,261],{"class":254},[60,678,32],{"class":146},[60,680,681],{"class":254},"NOT_FOUND",[60,683,493],{"class":153},[60,685,163],{"class":146},[60,687,689],{"class":62,"line":688},27,[60,690,511],{"class":146},[60,692,694],{"class":62,"line":693},28,[60,695,354],{"emptyLinePlaceholder":353},[60,697,699,702,704,706,708,710,712,715,717,719,721],{"class":62,"line":698},29,[60,700,701],{"class":153},"  update",[60,703,423],{"class":146},[60,705,566],{"class":426},[60,707,157],{"class":146},[60,709,160],{"class":66},[60,711,258],{"class":146},[60,713,714],{"class":426}," updateProductDto",[60,716,157],{"class":146},[60,718,314],{"class":66},[60,720,493],{"class":146},[60,722,147],{"class":146},[60,724,726,728,731,733,735,737,739,742],{"class":62,"line":725},30,[60,727,444],{"class":139},[60,729,730],{"class":254}," productIndex",[60,732,388],{"class":146},[60,734,541],{"class":146},[60,736,101],{"class":254},[60,738,32],{"class":146},[60,740,741],{"class":362},"findIndex",[60,743,744],{"class":153},"(\n",[60,746,748,751,753,755,757,759,761,763,765,767],{"class":62,"line":747},31,[60,749,750],{"class":146},"      (",[60,752,600],{"class":426},[60,754,493],{"class":146},[60,756,605],{"class":139},[60,758,582],{"class":254},[60,760,32],{"class":146},[60,762,566],{"class":254},[60,764,614],{"class":146},[60,766,454],{"class":254},[60,768,769],{"class":146},",\n",[60,771,773,776],{"class":62,"line":772},32,[60,774,775],{"class":153},"    )",[60,777,163],{"class":146},[60,779,781],{"class":62,"line":780},33,[60,782,354],{"emptyLinePlaceholder":353},[60,784,786,788,790,793,796,799,802,804],{"class":62,"line":785},34,[60,787,626],{"class":135},[60,789,629],{"class":153},[60,791,792],{"class":254},"productIndex",[60,794,795],{"class":146}," >",[60,797,798],{"class":146}," -",[60,800,801],{"class":391},"1",[60,803,634],{"class":153},[60,805,533],{"class":146},[60,807,809,812,814,817,819,822,825,827],{"class":62,"line":808},35,[60,810,811],{"class":146},"      this.",[60,813,101],{"class":254},[60,815,816],{"class":153},"[",[60,818,792],{"class":254},[60,820,821],{"class":153},"] ",[60,823,824],{"class":146},"=",[60,826,714],{"class":254},[60,828,163],{"class":146},[60,830,832,834,836],{"class":62,"line":831},36,[60,833,642],{"class":135},[60,835,714],{"class":254},[60,837,163],{"class":146},[60,839,841],{"class":62,"line":840},37,[60,842,652],{"class":146},[60,844,846,848,850,852,854,856,858,860,862,864,866,868,870],{"class":62,"line":845},38,[60,847,658],{"class":135},[60,849,661],{"class":146},[60,851,255],{"class":362},[60,853,423],{"class":153},[60,855,281],{"class":146},[60,857,670],{"class":70},[60,859,281],{"class":146},[60,861,258],{"class":146},[60,863,261],{"class":254},[60,865,32],{"class":146},[60,867,681],{"class":254},[60,869,493],{"class":153},[60,871,163],{"class":146},[60,873,875],{"class":62,"line":874},39,[60,876,511],{"class":146},[60,878,880],{"class":62,"line":879},40,[60,881,354],{"emptyLinePlaceholder":353},[60,883,885,888,890,892,894,896,898],{"class":62,"line":884},41,[60,886,887],{"class":153},"  remove",[60,889,423],{"class":146},[60,891,566],{"class":426},[60,893,157],{"class":146},[60,895,160],{"class":66},[60,897,493],{"class":146},[60,899,147],{"class":146},[60,901,903,905,907,909,911,913,915,917],{"class":62,"line":902},42,[60,904,444],{"class":139},[60,906,730],{"class":254},[60,908,388],{"class":146},[60,910,541],{"class":146},[60,912,101],{"class":254},[60,914,32],{"class":146},[60,916,741],{"class":362},[60,918,744],{"class":153},[60,920,922,924,926,928,930,932,934,936,938,940],{"class":62,"line":921},43,[60,923,750],{"class":146},[60,925,600],{"class":426},[60,927,493],{"class":146},[60,929,605],{"class":139},[60,931,582],{"class":254},[60,933,32],{"class":146},[60,935,566],{"class":254},[60,937,614],{"class":146},[60,939,454],{"class":254},[60,941,769],{"class":146},[60,943,945,947],{"class":62,"line":944},44,[60,946,775],{"class":153},[60,948,163],{"class":146},[60,950,952],{"class":62,"line":951},45,[60,953,354],{"emptyLinePlaceholder":353},[60,955,957,959,961,963,965,967,969,971],{"class":62,"line":956},46,[60,958,626],{"class":135},[60,960,629],{"class":153},[60,962,792],{"class":254},[60,964,795],{"class":146},[60,966,798],{"class":146},[60,968,801],{"class":391},[60,970,634],{"class":153},[60,972,533],{"class":146},[60,974,976,978,980,982,985,987,989,991,994,996],{"class":62,"line":975},47,[60,977,811],{"class":146},[60,979,101],{"class":254},[60,981,32],{"class":146},[60,983,984],{"class":362},"splice",[60,986,423],{"class":153},[60,988,792],{"class":254},[60,990,258],{"class":146},[60,992,993],{"class":391}," 1",[60,995,493],{"class":153},[60,997,163],{"class":146},[60,999,1001],{"class":62,"line":1000},48,[60,1002,652],{"class":146},[60,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030],{"class":62,"line":1005},49,[60,1007,658],{"class":135},[60,1009,661],{"class":146},[60,1011,255],{"class":362},[60,1013,423],{"class":153},[60,1015,281],{"class":146},[60,1017,670],{"class":70},[60,1019,281],{"class":146},[60,1021,258],{"class":146},[60,1023,261],{"class":254},[60,1025,32],{"class":146},[60,1027,681],{"class":254},[60,1029,493],{"class":153},[60,1031,163],{"class":146},[60,1033,1035],{"class":62,"line":1034},50,[60,1036,511],{"class":146},[60,1038,1040],{"class":62,"line":1039},51,[60,1041,230],{"class":146},[15,1043,1044],{},"Note que notre classe service implémente les cinq méthodes CRUD :",[1046,1047,1048,1055,1061,1067,1073],"ul",{},[1049,1050,1051,1054],"li",{},[41,1052,1053],{},"create"," : créer une nouvelle ressource produit",[1049,1056,1057,1060],{},[41,1058,1059],{},"findAll"," : récupérer tous les produits",[1049,1062,1063,1066],{},[41,1064,1065],{},"findOne"," : récupérer un produit par son ID",[1049,1068,1069,1072],{},[41,1070,1071],{},"update"," : mettre à jour une ressource produit",[1049,1074,1075,1078],{},[41,1076,1077],{},"delete"," : supprimer un produit",[1080,1081,1083],"h3",{"id":1082},"data-transfer-objects","Data Transfer Objects",[15,1085,1086],{},"En substance, les DTO aident à contrôler et valider les données lors de la création ou mise à\njour de ressources dans une application NestJS, en garantissant qu'elles respectent des règles\net contraintes spécifiques.",[1088,1089,1091],"h5",{"id":1090},"create-dto","Create DTO",[15,1093,1094],{},"Ils définissent la structure des données entrantes à la création d'une ressource. Cela aide à\nvalider et formater les données avant leur traitement.",[49,1096,1099],{"className":125,"code":1097,"filename":1098,"language":128,"meta":55,"style":55},"export class CreateProductDto {\n  name: string;\n  description: string;\n  category: string;\n  price: number;\n  image: string;\n}\n","create-product.dto.ts",[57,1100,1101,1111,1121,1131,1141,1151,1161],{"__ignoreMap":55},[60,1102,1103,1105,1107,1109],{"class":62,"line":63},[60,1104,136],{"class":135},[60,1106,140],{"class":139},[60,1108,292],{"class":66},[60,1110,147],{"class":146},[60,1112,1113,1115,1117,1119],{"class":62,"line":150},[60,1114,169],{"class":153},[60,1116,157],{"class":146},[60,1118,174],{"class":66},[60,1120,163],{"class":146},[60,1122,1123,1125,1127,1129],{"class":62,"line":166},[60,1124,182],{"class":153},[60,1126,157],{"class":146},[60,1128,174],{"class":66},[60,1130,163],{"class":146},[60,1132,1133,1135,1137,1139],{"class":62,"line":179},[60,1134,194],{"class":153},[60,1136,157],{"class":146},[60,1138,174],{"class":66},[60,1140,163],{"class":146},[60,1142,1143,1145,1147,1149],{"class":62,"line":191},[60,1144,206],{"class":153},[60,1146,157],{"class":146},[60,1148,160],{"class":66},[60,1150,163],{"class":146},[60,1152,1153,1155,1157,1159],{"class":62,"line":203},[60,1154,218],{"class":153},[60,1156,157],{"class":146},[60,1158,174],{"class":66},[60,1160,163],{"class":146},[60,1162,1163],{"class":62,"line":215},[60,1164,230],{"class":146},[1088,1166,1168],{"id":1167},"update-dto","Update DTO",[15,1170,1171],{},"Ils spécifient les champs autorisés à la mise à jour d'une ressource, garantissant que seules\ndes données valides peuvent être modifiées — renforçant intégrité et sécurité.",[49,1173,1176],{"className":125,"code":1174,"filename":1175,"language":128,"meta":55,"style":55},"import { PartialType } from '@nestjs\u002Fmapped-types';\nimport { CreateProductDto } from '.\u002Fcreate-product.dto';\n\nexport class UpdateProductDto extends PartialType(CreateProductDto) {\n  id: number;\n}\n","update-product.dto.ts",[57,1177,1178,1200,1221,1225,1243,1253],{"__ignoreMap":55},[60,1179,1180,1182,1184,1187,1189,1191,1193,1196,1198],{"class":62,"line":63},[60,1181,248],{"class":135},[60,1183,251],{"class":146},[60,1185,1186],{"class":254}," PartialType",[60,1188,269],{"class":146},[60,1190,272],{"class":135},[60,1192,275],{"class":146},[60,1194,1195],{"class":70},"@nestjs\u002Fmapped-types",[60,1197,281],{"class":146},[60,1199,163],{"class":146},[60,1201,1202,1204,1206,1208,1210,1212,1214,1217,1219],{"class":62,"line":150},[60,1203,248],{"class":135},[60,1205,251],{"class":146},[60,1207,292],{"class":254},[60,1209,269],{"class":146},[60,1211,272],{"class":135},[60,1213,275],{"class":146},[60,1215,1216],{"class":70},".\u002Fcreate-product.dto",[60,1218,281],{"class":146},[60,1220,163],{"class":146},[60,1222,1223],{"class":62,"line":166},[60,1224,354],{"emptyLinePlaceholder":353},[60,1226,1227,1229,1231,1233,1236,1238,1241],{"class":62,"line":179},[60,1228,136],{"class":135},[60,1230,140],{"class":139},[60,1232,314],{"class":66},[60,1234,1235],{"class":139}," extends",[60,1237,1186],{"class":362},[60,1239,1240],{"class":254},"(CreateProductDto) ",[60,1242,533],{"class":146},[60,1244,1245,1247,1249,1251],{"class":62,"line":191},[60,1246,154],{"class":153},[60,1248,157],{"class":146},[60,1250,160],{"class":66},[60,1252,163],{"class":146},[60,1254,1255],{"class":62,"line":203},[60,1256,230],{"class":146},[10,1258,1260],{"id":1259},"contrôleur","Contrôleur",[15,1262,1263,1264,1267],{},"Les ",[41,1265,1266],{},"contrôleurs"," sont responsables de recevoir les requêtes entrantes et de répondre au\nclient. Leur but principal est de recevoir les requêtes spécifiques pour l'application. Chaque\ncontrôleur a souvent plus d'une route, et des routes distinctes peuvent réaliser des actions\ndifférentes.",[15,1269,1270],{},"Regardons à quoi ressemble notre contrôleur produit :",[49,1272,1275],{"className":125,"code":1273,"filename":1274,"language":128,"meta":55,"style":55},"import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs\u002Fcommon';\nimport { ProductsService } from '.\u002Fproducts.service';\nimport { CreateProductDto } from '.\u002Fdto\u002Fcreate-product.dto';\nimport { UpdateProductDto } from '.\u002Fdto\u002Fupdate-product.dto';\n\n@Controller('products')\nexport class ProductsController {\n  constructor(private readonly productsService: ProductsService) {\n  }\n\n  @Post()\n  create(@Body() createProductDto: CreateProductDto) {\n    return this.productsService.create(createProductDto);\n  }\n\n  @Get()\n  findAll() {\n    return this.productsService.findAll();\n  }\n\n  @Get(':id')\n  findOne(@Param('id') id: string) {\n    return this.productsService.findOne(+id);\n  }\n\n  @Patch(':id')\n  update(@Param('id') id: string, @Body() updateProductDto: UpdateProductDto) {\n    return this.productsService.update(+id, updateProductDto);\n  }\n\n  @Delete(':id')\n  remove(@Param('id') id: string) {\n    return this.productsService.remove(+id);\n  }\n}\n\n","product.controller.ts",[57,1276,1277,1328,1349,1369,1389,1393,1411,1422,1446,1450,1454,1464,1487,1508,1512,1516,1525,1534,1550,1554,1558,1575,1604,1627,1631,1635,1652,1696,1722,1726,1730,1747,1775,1798,1802],{"__ignoreMap":55},[60,1278,1279,1281,1283,1286,1288,1291,1293,1296,1298,1301,1303,1306,1308,1311,1313,1316,1318,1320,1322,1324,1326],{"class":62,"line":63},[60,1280,248],{"class":135},[60,1282,251],{"class":146},[60,1284,1285],{"class":254}," Controller",[60,1287,258],{"class":146},[60,1289,1290],{"class":254}," Get",[60,1292,258],{"class":146},[60,1294,1295],{"class":254}," Post",[60,1297,258],{"class":146},[60,1299,1300],{"class":254}," Body",[60,1302,258],{"class":146},[60,1304,1305],{"class":254}," Patch",[60,1307,258],{"class":146},[60,1309,1310],{"class":254}," Param",[60,1312,258],{"class":146},[60,1314,1315],{"class":254}," Delete",[60,1317,269],{"class":146},[60,1319,272],{"class":135},[60,1321,275],{"class":146},[60,1323,278],{"class":70},[60,1325,281],{"class":146},[60,1327,163],{"class":146},[60,1329,1330,1332,1334,1336,1338,1340,1342,1345,1347],{"class":62,"line":150},[60,1331,248],{"class":135},[60,1333,251],{"class":146},[60,1335,375],{"class":254},[60,1337,269],{"class":146},[60,1339,272],{"class":135},[60,1341,275],{"class":146},[60,1343,1344],{"class":70},".\u002Fproducts.service",[60,1346,281],{"class":146},[60,1348,163],{"class":146},[60,1350,1351,1353,1355,1357,1359,1361,1363,1365,1367],{"class":62,"line":166},[60,1352,248],{"class":135},[60,1354,251],{"class":146},[60,1356,292],{"class":254},[60,1358,269],{"class":146},[60,1360,272],{"class":135},[60,1362,275],{"class":146},[60,1364,301],{"class":70},[60,1366,281],{"class":146},[60,1368,163],{"class":146},[60,1370,1371,1373,1375,1377,1379,1381,1383,1385,1387],{"class":62,"line":179},[60,1372,248],{"class":135},[60,1374,251],{"class":146},[60,1376,314],{"class":254},[60,1378,269],{"class":146},[60,1380,272],{"class":135},[60,1382,275],{"class":146},[60,1384,323],{"class":70},[60,1386,281],{"class":146},[60,1388,163],{"class":146},[60,1390,1391],{"class":62,"line":191},[60,1392,354],{"emptyLinePlaceholder":353},[60,1394,1395,1397,1400,1402,1404,1406,1408],{"class":62,"line":203},[60,1396,359],{"class":146},[60,1398,1399],{"class":362},"Controller",[60,1401,423],{"class":254},[60,1403,281],{"class":146},[60,1405,101],{"class":70},[60,1407,281],{"class":146},[60,1409,1410],{"class":254},")\n",[60,1412,1413,1415,1417,1420],{"class":62,"line":215},[60,1414,136],{"class":135},[60,1416,140],{"class":139},[60,1418,1419],{"class":66}," ProductsController",[60,1421,147],{"class":146},[60,1423,1424,1427,1429,1432,1435,1438,1440,1442,1444],{"class":62,"line":227},[60,1425,1426],{"class":139},"  constructor",[60,1428,423],{"class":146},[60,1430,1431],{"class":139},"private",[60,1433,1434],{"class":139}," readonly",[60,1436,1437],{"class":426}," productsService",[60,1439,157],{"class":146},[60,1441,375],{"class":66},[60,1443,493],{"class":146},[60,1445,147],{"class":146},[60,1447,1448],{"class":62,"line":397},[60,1449,511],{"class":146},[60,1451,1452],{"class":62,"line":412},[60,1453,354],{"emptyLinePlaceholder":353},[60,1455,1456,1459,1462],{"class":62,"line":417},[60,1457,1458],{"class":146},"  @",[60,1460,1461],{"class":362},"Post",[60,1463,366],{"class":254},[60,1465,1466,1468,1471,1474,1477,1479,1481,1483,1485],{"class":62,"line":441},[60,1467,420],{"class":153},[60,1469,1470],{"class":146},"(@",[60,1472,1473],{"class":362},"Body",[60,1475,1476],{"class":254},"() ",[60,1478,427],{"class":426},[60,1480,157],{"class":146},[60,1482,292],{"class":66},[60,1484,493],{"class":146},[60,1486,147],{"class":146},[60,1488,1489,1491,1493,1496,1498,1500,1502,1504,1506],{"class":62,"line":475},[60,1490,501],{"class":135},[60,1492,541],{"class":146},[60,1494,1495],{"class":254},"productsService",[60,1497,32],{"class":146},[60,1499,1053],{"class":362},[60,1501,423],{"class":153},[60,1503,427],{"class":254},[60,1505,493],{"class":153},[60,1507,163],{"class":146},[60,1509,1510],{"class":62,"line":498},[60,1511,511],{"class":146},[60,1513,1514],{"class":62,"line":508},[60,1515,354],{"emptyLinePlaceholder":353},[60,1517,1518,1520,1523],{"class":62,"line":514},[60,1519,1458],{"class":146},[60,1521,1522],{"class":362},"Get",[60,1524,366],{"class":254},[60,1526,1527,1529,1532],{"class":62,"line":519},[60,1528,522],{"class":153},[60,1530,1531],{"class":146},"()",[60,1533,147],{"class":146},[60,1535,1536,1538,1540,1542,1544,1546,1548],{"class":62,"line":536},[60,1537,501],{"class":135},[60,1539,541],{"class":146},[60,1541,1495],{"class":254},[60,1543,32],{"class":146},[60,1545,1059],{"class":362},[60,1547,1531],{"class":153},[60,1549,163],{"class":146},[60,1551,1552],{"class":62,"line":548},[60,1553,511],{"class":146},[60,1555,1556],{"class":62,"line":553},[60,1557,354],{"emptyLinePlaceholder":353},[60,1559,1560,1562,1564,1566,1568,1571,1573],{"class":62,"line":558},[60,1561,1458],{"class":146},[60,1563,1522],{"class":362},[60,1565,423],{"class":254},[60,1567,281],{"class":146},[60,1569,1570],{"class":70},":id",[60,1572,281],{"class":146},[60,1574,1410],{"class":254},[60,1576,1577,1579,1581,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602],{"class":62,"line":577},[60,1578,561],{"class":153},[60,1580,1470],{"class":146},[60,1582,1583],{"class":362},"Param",[60,1585,423],{"class":254},[60,1587,281],{"class":146},[60,1589,566],{"class":70},[60,1591,281],{"class":146},[60,1593,634],{"class":254},[60,1595,566],{"class":426},[60,1597,157],{"class":146},[60,1599,174],{"class":66},[60,1601,493],{"class":146},[60,1603,147],{"class":146},[60,1605,1606,1608,1610,1612,1614,1616,1618,1621,1623,1625],{"class":62,"line":623},[60,1607,501],{"class":135},[60,1609,541],{"class":146},[60,1611,1495],{"class":254},[60,1613,32],{"class":146},[60,1615,1065],{"class":362},[60,1617,423],{"class":153},[60,1619,1620],{"class":146},"+",[60,1622,566],{"class":254},[60,1624,493],{"class":153},[60,1626,163],{"class":146},[60,1628,1629],{"class":62,"line":639},[60,1630,511],{"class":146},[60,1632,1633],{"class":62,"line":649},[60,1634,354],{"emptyLinePlaceholder":353},[60,1636,1637,1639,1642,1644,1646,1648,1650],{"class":62,"line":655},[60,1638,1458],{"class":146},[60,1640,1641],{"class":362},"Patch",[60,1643,423],{"class":254},[60,1645,281],{"class":146},[60,1647,1570],{"class":70},[60,1649,281],{"class":146},[60,1651,1410],{"class":254},[60,1653,1654,1656,1658,1660,1662,1664,1666,1668,1670,1672,1674,1676,1678,1681,1683,1685,1688,1690,1692,1694],{"class":62,"line":688},[60,1655,701],{"class":153},[60,1657,1470],{"class":146},[60,1659,1583],{"class":362},[60,1661,423],{"class":254},[60,1663,281],{"class":146},[60,1665,566],{"class":70},[60,1667,281],{"class":146},[60,1669,634],{"class":254},[60,1671,566],{"class":426},[60,1673,157],{"class":146},[60,1675,174],{"class":66},[60,1677,258],{"class":146},[60,1679,1680],{"class":146}," @",[60,1682,1473],{"class":362},[60,1684,1476],{"class":254},[60,1686,1687],{"class":426},"updateProductDto",[60,1689,157],{"class":146},[60,1691,314],{"class":66},[60,1693,493],{"class":146},[60,1695,147],{"class":146},[60,1697,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720],{"class":62,"line":693},[60,1699,501],{"class":135},[60,1701,541],{"class":146},[60,1703,1495],{"class":254},[60,1705,32],{"class":146},[60,1707,1071],{"class":362},[60,1709,423],{"class":153},[60,1711,1620],{"class":146},[60,1713,566],{"class":254},[60,1715,258],{"class":146},[60,1717,714],{"class":254},[60,1719,493],{"class":153},[60,1721,163],{"class":146},[60,1723,1724],{"class":62,"line":698},[60,1725,511],{"class":146},[60,1727,1728],{"class":62,"line":725},[60,1729,354],{"emptyLinePlaceholder":353},[60,1731,1732,1734,1737,1739,1741,1743,1745],{"class":62,"line":747},[60,1733,1458],{"class":146},[60,1735,1736],{"class":362},"Delete",[60,1738,423],{"class":254},[60,1740,281],{"class":146},[60,1742,1570],{"class":70},[60,1744,281],{"class":146},[60,1746,1410],{"class":254},[60,1748,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773],{"class":62,"line":772},[60,1750,887],{"class":153},[60,1752,1470],{"class":146},[60,1754,1583],{"class":362},[60,1756,423],{"class":254},[60,1758,281],{"class":146},[60,1760,566],{"class":70},[60,1762,281],{"class":146},[60,1764,634],{"class":254},[60,1766,566],{"class":426},[60,1768,157],{"class":146},[60,1770,174],{"class":66},[60,1772,493],{"class":146},[60,1774,147],{"class":146},[60,1776,1777,1779,1781,1783,1785,1788,1790,1792,1794,1796],{"class":62,"line":780},[60,1778,501],{"class":135},[60,1780,541],{"class":146},[60,1782,1495],{"class":254},[60,1784,32],{"class":146},[60,1786,1787],{"class":362},"remove",[60,1789,423],{"class":153},[60,1791,1620],{"class":146},[60,1793,566],{"class":254},[60,1795,493],{"class":153},[60,1797,163],{"class":146},[60,1799,1800],{"class":62,"line":785},[60,1801,511],{"class":146},[60,1803,1804],{"class":62,"line":808},[60,1805,230],{"class":146},[15,1807,1808,1809,1812,1813,1816,1817,1819,1820,1823],{},"La première chose à noter : NestJS fait un usage intensif des ",[41,1810,1811],{},"décorateurs",". Le décorateur\n",[57,1814,1815],{},"@Controller()"," sert à indiquer qu'une classe est un contrôleur. Dans l'exemple ci-dessus, on a\nutilisé ",[57,1818,1815],{}," avec un paramètre ",[1821,1822,101],"em",{}," qui représente le chemin de la route. Note\nque si tu ne fournis pas de valeur en paramètre, le contrôleur est accessible depuis l'hôte\nsans avoir besoin de fournir un nom de chemin.",[1080,1825,1827],{"id":1826},"routing","Routing",[15,1829,1830,1831,1834,1835,1834,1838,1841,1842,1845],{},"Les décorateurs de méthode HTTP ",[57,1832,1833],{},"@Get()",", ",[57,1836,1837],{},"@Post()",[57,1839,1840],{},"@Delete()"," et ",[57,1843,1844],{},"@Put()"," placés devant les\nméthodes de la classe contrôleur indiquent à NestJS de créer un handler pour le endpoint\néquivalent. Le endpoint correspond à la méthode HTTP et au chemin de la route.",[1080,1847,1849],{"id":1848},"body-de-requête-et-query-param","Body de requête et Query Param",[15,1851,1852,1853,1856],{},"On a besoin d'accéder au contenu d'une requête lors du traitement des POST et PUT dans le\ncontrôleur ci-dessus. NestJS inclut un décorateur ",[57,1854,1855],{},"@Body()"," qui permet d'accéder facilement au\ncorps de la requête HTTP. On a déjà introduit le concept de DTO. Il aide à contrôler et valider\nles données lors de la création ou mise à jour de ressources.",[15,1858,1859,1860,1863,1864,1866],{},"Parallèlement, remarque le décorateur ",[57,1861,1862],{},"@Param('id')"," qui indique à NestJS que notre chemin\ncontient un paramètre nommé ",[57,1865,566],{},", qu'il faut fournir au moment de la requête.",[10,1868,1870],{"id":1869},"module","Module",[15,1872,1873,1874,1877,1878,1880],{},"Un module est une classe annotée par le décorateur ",[57,1875,1876],{},"@Module()",". Nest utilise les métadonnées\nfournies par ",[57,1879,1876],{}," pour organiser la structure de l'application.",[15,1882,1883,1884,1887],{},"Chaque application contient au moins un module, appelé ",[41,1885,1886],{},"module racine",". Nest construit le\ngraphe applicatif depuis le module racine, qui est la structure de données interne utilisée par\nNest pour résoudre les interactions et dépendances entre modules et providers. Même si en\nthéorie de très petits programmes peuvent ne contenir que le module racine, ce n'est pas la\nnorme.",[15,1889,1890],{},"Regardons à quoi ressemble le module produit :",[49,1892,1895],{"className":125,"code":1893,"filename":1894,"language":128,"meta":55,"style":55},"import { Module } from '@nestjs\u002Fcommon';\nimport { ProductsService } from '.\u002Fproducts.service';\nimport { ProductsController } from '.\u002Fproducts.controller';\n\n@Module({\n  controllers: [ProductsController],\n  providers: [ProductsService],\n})\nexport class ProductsModule {\n}\n\n","product.module.ts",[57,1896,1897,1918,1938,1959,1963,1973,1985,1997,2004,2015],{"__ignoreMap":55},[60,1898,1899,1901,1903,1906,1908,1910,1912,1914,1916],{"class":62,"line":63},[60,1900,248],{"class":135},[60,1902,251],{"class":146},[60,1904,1905],{"class":254}," Module",[60,1907,269],{"class":146},[60,1909,272],{"class":135},[60,1911,275],{"class":146},[60,1913,278],{"class":70},[60,1915,281],{"class":146},[60,1917,163],{"class":146},[60,1919,1920,1922,1924,1926,1928,1930,1932,1934,1936],{"class":62,"line":150},[60,1921,248],{"class":135},[60,1923,251],{"class":146},[60,1925,375],{"class":254},[60,1927,269],{"class":146},[60,1929,272],{"class":135},[60,1931,275],{"class":146},[60,1933,1344],{"class":70},[60,1935,281],{"class":146},[60,1937,163],{"class":146},[60,1939,1940,1942,1944,1946,1948,1950,1952,1955,1957],{"class":62,"line":166},[60,1941,248],{"class":135},[60,1943,251],{"class":146},[60,1945,1419],{"class":254},[60,1947,269],{"class":146},[60,1949,272],{"class":135},[60,1951,275],{"class":146},[60,1953,1954],{"class":70},".\u002Fproducts.controller",[60,1956,281],{"class":146},[60,1958,163],{"class":146},[60,1960,1961],{"class":62,"line":179},[60,1962,354],{"emptyLinePlaceholder":353},[60,1964,1965,1967,1969,1971],{"class":62,"line":191},[60,1966,359],{"class":146},[60,1968,1870],{"class":362},[60,1970,423],{"class":254},[60,1972,533],{"class":146},[60,1974,1975,1978,1980,1983],{"class":62,"line":203},[60,1976,1977],{"class":153},"  controllers",[60,1979,157],{"class":146},[60,1981,1982],{"class":254}," [ProductsController]",[60,1984,769],{"class":146},[60,1986,1987,1990,1992,1995],{"class":62,"line":215},[60,1988,1989],{"class":153},"  providers",[60,1991,157],{"class":146},[60,1993,1994],{"class":254}," [ProductsService]",[60,1996,769],{"class":146},[60,1998,1999,2002],{"class":62,"line":227},[60,2000,2001],{"class":146},"}",[60,2003,1410],{"class":254},[60,2005,2006,2008,2010,2013],{"class":62,"line":397},[60,2007,136],{"class":135},[60,2009,140],{"class":139},[60,2011,2012],{"class":66}," ProductsModule",[60,2014,147],{"class":146},[60,2016,2017],{"class":62,"line":412},[60,2018,230],{"class":146},[15,2020,2021,2022,2024],{},"Le décorateur ",[57,2023,1876],{}," prend un objet unique dont les propriétés décrivent le module :",[1046,2026,2027,2033,2039,2045],{},[1049,2028,2029,2032],{},[41,2030,2031],{},"controllers"," : l'ensemble des contrôleurs définis dans ce module et qui doivent être\ninstanciés.",[1049,2034,2035,2038],{},[41,2036,2037],{},"providers"," : les providers qui seront instanciés par l'injecteur Nest et qui peuvent être\npartagés au moins à l'intérieur de ce module.",[1049,2040,2041,2044],{},[41,2042,2043],{},"imports"," : la liste des modules importés qui exportent les providers nécessaires à ce\nmodule.",[1049,2046,2047,2050],{},[41,2048,2049],{},"exports"," : le sous-ensemble de providers fournis par ce module et qui doivent être\ndisponibles dans d'autres modules qui importent celui-ci.",[15,2052,2053,2054,2056],{},"Enfin, jetons un œil au fichier ",[57,2055,105],{}," :",[49,2058,2062],{"className":2059,"code":2060,"filename":105,"language":2061,"meta":55,"style":55},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from '@nestjs\u002Fcommon';\nimport { AppController } from '.\u002Fapp.controller';\nimport { AppService } from '.\u002Fapp.service';\nimport { ProductsModule } from '.\u002Fproducts\u002Fproducts.module';\n\n@Module({\n  imports: [ProductsModule],\n  controllers: [AppController],\n  providers: [AppService],\n})\nexport class AppModule {\n}\n\n\n","typescript",[57,2063,2064,2084,2106,2128,2149,2153,2163,2175,2186,2197,2203,2214],{"__ignoreMap":55},[60,2065,2066,2068,2070,2072,2074,2076,2078,2080,2082],{"class":62,"line":63},[60,2067,248],{"class":135},[60,2069,251],{"class":146},[60,2071,1905],{"class":254},[60,2073,269],{"class":146},[60,2075,272],{"class":135},[60,2077,275],{"class":146},[60,2079,278],{"class":70},[60,2081,281],{"class":146},[60,2083,163],{"class":146},[60,2085,2086,2088,2090,2093,2095,2097,2099,2102,2104],{"class":62,"line":150},[60,2087,248],{"class":135},[60,2089,251],{"class":146},[60,2091,2092],{"class":254}," AppController",[60,2094,269],{"class":146},[60,2096,272],{"class":135},[60,2098,275],{"class":146},[60,2100,2101],{"class":70},".\u002Fapp.controller",[60,2103,281],{"class":146},[60,2105,163],{"class":146},[60,2107,2108,2110,2112,2115,2117,2119,2121,2124,2126],{"class":62,"line":166},[60,2109,248],{"class":135},[60,2111,251],{"class":146},[60,2113,2114],{"class":254}," AppService",[60,2116,269],{"class":146},[60,2118,272],{"class":135},[60,2120,275],{"class":146},[60,2122,2123],{"class":70},".\u002Fapp.service",[60,2125,281],{"class":146},[60,2127,163],{"class":146},[60,2129,2130,2132,2134,2136,2138,2140,2142,2145,2147],{"class":62,"line":179},[60,2131,248],{"class":135},[60,2133,251],{"class":146},[60,2135,2012],{"class":254},[60,2137,269],{"class":146},[60,2139,272],{"class":135},[60,2141,275],{"class":146},[60,2143,2144],{"class":70},".\u002Fproducts\u002Fproducts.module",[60,2146,281],{"class":146},[60,2148,163],{"class":146},[60,2150,2151],{"class":62,"line":191},[60,2152,354],{"emptyLinePlaceholder":353},[60,2154,2155,2157,2159,2161],{"class":62,"line":203},[60,2156,359],{"class":146},[60,2158,1870],{"class":362},[60,2160,423],{"class":254},[60,2162,533],{"class":146},[60,2164,2165,2168,2170,2173],{"class":62,"line":215},[60,2166,2167],{"class":153},"  imports",[60,2169,157],{"class":146},[60,2171,2172],{"class":254}," [ProductsModule]",[60,2174,769],{"class":146},[60,2176,2177,2179,2181,2184],{"class":62,"line":227},[60,2178,1977],{"class":153},[60,2180,157],{"class":146},[60,2182,2183],{"class":254}," [AppController]",[60,2185,769],{"class":146},[60,2187,2188,2190,2192,2195],{"class":62,"line":397},[60,2189,1989],{"class":153},[60,2191,157],{"class":146},[60,2193,2194],{"class":254}," [AppService]",[60,2196,769],{"class":146},[60,2198,2199,2201],{"class":62,"line":412},[60,2200,2001],{"class":146},[60,2202,1410],{"class":254},[60,2204,2205,2207,2209,2212],{"class":62,"line":417},[60,2206,136],{"class":135},[60,2208,140],{"class":139},[60,2210,2211],{"class":66}," AppModule",[60,2213,147],{"class":146},[60,2215,2216],{"class":62,"line":441},[60,2217,230],{"class":146},[15,2219,2220],{},"Et maintenant ? Démarrer le serveur de développement, peut-être ? Allons-y !",[79,2222],{"alt":2223,"source":2224},"Démarrage du serveur NestJS","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fnest-js\u002F2-nestjs-service-module-controller\u002Fttoqqufmpr6xlgstzvng",[15,2226,2227,2228],{},"Voilà, tout est maintenant en place pour gérer un petit CRUD de produits pour un catalogue\ne-commerce. Je partage la collection Postman pour tester les endpoints dans ton environnement.\n",[25,2229,2232],{"href":2230,"rel":2231},"https:\u002F\u002Fapp.getpostman.com\u002Frun-collection\u002F6548572-ee3e0ff8-995e-4fbe-90bf-8418026d6ba1?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D6548572-ee3e0ff8-995e-4fbe-90bf-8418026d6ba1%26entityType%3Dcollection%26workspaceId%3Dae7c795a-f0ce-4ee3-8fb6-2d581a71c520",[29],[2233,2234],"img",{"alt":2235,"src":2236},"Run in Postman","https:\u002F\u002Frun.pstmn.io\u002Fbutton.svg",[10,2238,2240],{"id":2239},"résumé","Résumé",[15,2242,2243],{},"On vient juste de gratter la surface de NestJS. On comprend désormais ce qu'est un contrôleur\net comment gérer du routing basique dans notre application. On a également brièvement abordé\nles services et les modules. Dans les prochaines parties de cette série, on consacrera un temps\nsignificatif à étudier la structure d'application en NestJS.",[15,2245,2246],{},"Toutes les informations présentées ci-dessus ne sont que la partie émergée de l'iceberg NestJS.\nJ'espère t'avoir convaincu que ce framework vaut la peine d'être exploré, parce qu'il apporte\nbeaucoup de valeur. Il y a énormément à dire sur les fonctionnalités de Nest, comme la gestion\npropre des erreurs et l'injection de dépendances. On abordera aussi la base PostgreSQL et son\nusage via un ORM, et bien sûr on parlera d'authentification et d'autorisation avec NestJS.",[15,2248,2249],{},"À suivre !",[2251,2252,2253],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":55,"searchDepth":150,"depth":150,"links":2255},[2256,2257,2258,2259,2262,2266,2267],{"id":12,"depth":150,"text":13},{"id":35,"depth":150,"text":36},{"id":112,"depth":150,"text":113},{"id":233,"depth":150,"text":234,"children":2260},[2261],{"id":1082,"depth":166,"text":1083},{"id":1259,"depth":150,"text":1260,"children":2263},[2264,2265],{"id":1826,"depth":166,"text":1827},{"id":1848,"depth":166,"text":1849},{"id":1869,"depth":150,"text":1870},{"id":2239,"depth":150,"text":2240},"2023-09-03","Apprends les composants essentiels de NestJS pour construire des applications serveur scalables. Examine le rôle des services, modules et contrôleurs en exploitant les capacités des DTO (Data Transfer Objects) pour la validation et le renforcement de la sécurité.","md","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Fv1692780505\u002FBlog\u002Farticles\u002Fnest-js\u002Fazgcjzm8pwgdckdybir9.svg",{},"\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers.fr",{"title":5,"description":2269},"nestjs-service-module-controller","2.backend\u002F1.nest-js\u002F2.understanding-services-modules-and-controllers.fr",[2278,2279,2280],"Nest-JS","Mirco-service","API",[2282,2283],"nest-js","backend","3QxfIHEmiRix7sc8CpSkCMikXhtjWZt59e4M_cLIGrE",{"id":2286,"title":2287,"body":2288,"date":2268,"description":4194,"extension":2270,"img":2271,"meta":4195,"navigation":353,"path":4196,"seo":4197,"slug":2275,"stem":4198,"tags":4199,"topics":4200,"__hash__":4201},"content\u002F2.backend\u002F1.nest-js\u002F2.understanding-services-modules-and-controllers.md","Mastering NestJS: Understanding Services, Modules, and Controllers",{"type":7,"value":2289,"toc":4180},[2290,2292,2295,2305,2309,2312,2315,2329,2332,2337,2346,2348,2352,2355,2358,2436,2438,2441,3111,3114,3131,3133,3136,3138,3141,3209,3211,3214,3292,3295,3298,3301,3803,3815,3817,3829,3833,3839,3845,3847,3856,3859,3862,3980,3986,4000,4003,4151,4154,4157,4165,4169,4172,4175,4178],[10,2291,13],{"id":12},[15,2293,2294],{},"In a previous post, we introduced you to NestJS, a TypeScript-based modern framework based on Node.js that brings\nstructure and efficiency to your backend projects. In this ongoing series, we'll dive deeper into NestJS's key features\nand concepts. You'll gain a comprehensive\nunderstanding of modules, controllers, routes, providers, services, exception handling, and\nvalidation through a project that will consist of implementing the CRUD (Create, Read, Update, Delete) of products from\nan\ne-commerce catalog.",[19,2296,2297],{},[15,2298,2299,2300],{},"I created a GitHub repo for this series accessible at the following\n",[25,2301,2304],{"href":27,"rel":2302,"title":2303},[29],"Awesome nest-js project","address",[10,2306,2308],{"id":2307},"crud-resource","CRUD resource",[15,2310,2311],{},"Since we're about to create a Product resource, the most straightforward way to handle this is to run a unique command\nthat will generate a new CRUD resource resulting from a module, a controller to define CRUD routes, a service to\nimplement & isolate business logic, an entity\nclass\u002Finterface to\nrepresent the resource data shape, and DTOs to define how the data will be sent over the network,",[15,2313,2314],{},"Let's create our first CRUD resource the following cli command:",[49,2316,2317],{"className":51,"code":52,"filename":53,"language":54,"meta":55,"style":55},[57,2318,2319],{"__ignoreMap":55},[60,2320,2321,2323,2325,2327],{"class":62,"line":63},[60,2322,67],{"class":66},[60,2324,71],{"class":70},[60,2326,74],{"class":70},[60,2328,77],{"class":70},[79,2330],{"alt":2331,"source":82},"Create nest resource",[19,2333,2334],{},[15,2335,2336],{},"In the following screenshot, please notice that use REST API as transport layer and hint Y when asked if we would like\nto generate CRUD entry points",[15,2338,2339,2340,2342,2343,2345],{},"If everything goes well, you will notice that you have a new folder named ",[41,2341,101],{}," and that your ",[41,2344,105],{},"\nfile has also changed. Let's explore all this in the next sections.",[79,2347],{"alt":2331,"source":109},[10,2349,2351],{"id":2350},"entity","Entity",[15,2353,2354],{},"The purpose of an Entity in NestJS is to define the structure and schema of your data models, primarily for database\ninteractions. In a real-world project, this entity class will be manipulated through an ORM like Prisma, MikroORM,\nTypeORM ..., but at this state we're not going to dive in that.",[15,2356,2357],{},"Let me show you what the product entity looks like",[49,2359,2360],{"className":125,"code":126,"filename":127,"language":128,"meta":55,"style":55},[57,2361,2362,2372,2382,2392,2402,2412,2422,2432],{"__ignoreMap":55},[60,2363,2364,2366,2368,2370],{"class":62,"line":63},[60,2365,136],{"class":135},[60,2367,140],{"class":139},[60,2369,143],{"class":66},[60,2371,147],{"class":146},[60,2373,2374,2376,2378,2380],{"class":62,"line":150},[60,2375,154],{"class":153},[60,2377,157],{"class":146},[60,2379,160],{"class":66},[60,2381,163],{"class":146},[60,2383,2384,2386,2388,2390],{"class":62,"line":166},[60,2385,169],{"class":153},[60,2387,157],{"class":146},[60,2389,174],{"class":66},[60,2391,163],{"class":146},[60,2393,2394,2396,2398,2400],{"class":62,"line":179},[60,2395,182],{"class":153},[60,2397,157],{"class":146},[60,2399,174],{"class":66},[60,2401,163],{"class":146},[60,2403,2404,2406,2408,2410],{"class":62,"line":191},[60,2405,194],{"class":153},[60,2407,157],{"class":146},[60,2409,174],{"class":66},[60,2411,163],{"class":146},[60,2413,2414,2416,2418,2420],{"class":62,"line":203},[60,2415,206],{"class":153},[60,2417,157],{"class":146},[60,2419,160],{"class":66},[60,2421,163],{"class":146},[60,2423,2424,2426,2428,2430],{"class":62,"line":215},[60,2425,218],{"class":153},[60,2427,157],{"class":146},[60,2429,174],{"class":66},[60,2431,163],{"class":146},[60,2433,2434],{"class":62,"line":227},[60,2435,230],{"class":146},[10,2437,234],{"id":233},[15,2439,2440],{},"In a NestJS project, services enable you to separate your application's logic into reusable and testable units. This\nseparation of concerns\npromotes code maintainability and makes it easier to collaborate on larger projects.",[49,2442,2443],{"className":125,"code":240,"filename":241,"language":128,"meta":55,"style":55},[57,2444,2445,2473,2493,2513,2533,2537,2545,2555,2567,2579,2583,2601,2627,2645,2653,2657,2661,2673,2683,2687,2691,2707,2747,2759,2767,2771,2799,2803,2807,2831,2849,2871,2877,2881,2899,2917,2925,2929,2957,2961,2965,2981,2999,3021,3027,3031,3049,3071,3075,3103,3107],{"__ignoreMap":55},[60,2446,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471],{"class":62,"line":63},[60,2448,248],{"class":135},[60,2450,251],{"class":146},[60,2452,255],{"class":254},[60,2454,258],{"class":146},[60,2456,261],{"class":254},[60,2458,258],{"class":146},[60,2460,266],{"class":254},[60,2462,269],{"class":146},[60,2464,272],{"class":135},[60,2466,275],{"class":146},[60,2468,278],{"class":70},[60,2470,281],{"class":146},[60,2472,163],{"class":146},[60,2474,2475,2477,2479,2481,2483,2485,2487,2489,2491],{"class":62,"line":150},[60,2476,248],{"class":135},[60,2478,251],{"class":146},[60,2480,292],{"class":254},[60,2482,269],{"class":146},[60,2484,272],{"class":135},[60,2486,275],{"class":146},[60,2488,301],{"class":70},[60,2490,281],{"class":146},[60,2492,163],{"class":146},[60,2494,2495,2497,2499,2501,2503,2505,2507,2509,2511],{"class":62,"line":166},[60,2496,248],{"class":135},[60,2498,251],{"class":146},[60,2500,314],{"class":254},[60,2502,269],{"class":146},[60,2504,272],{"class":135},[60,2506,275],{"class":146},[60,2508,323],{"class":70},[60,2510,281],{"class":146},[60,2512,163],{"class":146},[60,2514,2515,2517,2519,2521,2523,2525,2527,2529,2531],{"class":62,"line":179},[60,2516,248],{"class":135},[60,2518,251],{"class":146},[60,2520,143],{"class":254},[60,2522,269],{"class":146},[60,2524,272],{"class":135},[60,2526,275],{"class":146},[60,2528,344],{"class":70},[60,2530,281],{"class":146},[60,2532,163],{"class":146},[60,2534,2535],{"class":62,"line":191},[60,2536,354],{"emptyLinePlaceholder":353},[60,2538,2539,2541,2543],{"class":62,"line":203},[60,2540,359],{"class":146},[60,2542,363],{"class":362},[60,2544,366],{"class":254},[60,2546,2547,2549,2551,2553],{"class":62,"line":215},[60,2548,136],{"class":135},[60,2550,140],{"class":139},[60,2552,375],{"class":66},[60,2554,147],{"class":146},[60,2556,2557,2559,2561,2563,2565],{"class":62,"line":227},[60,2558,382],{"class":139},[60,2560,385],{"class":153},[60,2562,388],{"class":146},[60,2564,392],{"class":391},[60,2566,163],{"class":146},[60,2568,2569,2571,2573,2575,2577],{"class":62,"line":397},[60,2570,382],{"class":139},[60,2572,402],{"class":153},[60,2574,388],{"class":146},[60,2576,407],{"class":254},[60,2578,163],{"class":146},[60,2580,2581],{"class":62,"line":412},[60,2582,354],{"emptyLinePlaceholder":353},[60,2584,2585,2587,2589,2591,2593,2595,2597,2599],{"class":62,"line":417},[60,2586,420],{"class":153},[60,2588,423],{"class":146},[60,2590,427],{"class":426},[60,2592,157],{"class":146},[60,2594,292],{"class":66},[60,2596,434],{"class":146},[60,2598,143],{"class":66},[60,2600,147],{"class":146},[60,2602,2603,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623,2625],{"class":62,"line":441},[60,2604,444],{"class":139},[60,2606,447],{"class":254},[60,2608,388],{"class":146},[60,2610,251],{"class":146},[60,2612,454],{"class":153},[60,2614,157],{"class":146},[60,2616,459],{"class":146},[60,2618,462],{"class":254},[60,2620,258],{"class":146},[60,2622,467],{"class":146},[60,2624,427],{"class":254},[60,2626,472],{"class":146},[60,2628,2629,2631,2633,2635,2637,2639,2641,2643],{"class":62,"line":475},[60,2630,478],{"class":146},[60,2632,101],{"class":254},[60,2634,32],{"class":146},[60,2636,485],{"class":362},[60,2638,423],{"class":153},[60,2640,490],{"class":254},[60,2642,493],{"class":153},[60,2644,163],{"class":146},[60,2646,2647,2649,2651],{"class":62,"line":498},[60,2648,501],{"class":135},[60,2650,447],{"class":254},[60,2652,163],{"class":146},[60,2654,2655],{"class":62,"line":508},[60,2656,511],{"class":146},[60,2658,2659],{"class":62,"line":514},[60,2660,354],{"emptyLinePlaceholder":353},[60,2662,2663,2665,2667,2669,2671],{"class":62,"line":519},[60,2664,522],{"class":153},[60,2666,525],{"class":146},[60,2668,143],{"class":66},[60,2670,530],{"class":254},[60,2672,533],{"class":146},[60,2674,2675,2677,2679,2681],{"class":62,"line":536},[60,2676,501],{"class":135},[60,2678,541],{"class":146},[60,2680,101],{"class":254},[60,2682,163],{"class":146},[60,2684,2685],{"class":62,"line":548},[60,2686,511],{"class":146},[60,2688,2689],{"class":62,"line":553},[60,2690,354],{"emptyLinePlaceholder":353},[60,2692,2693,2695,2697,2699,2701,2703,2705],{"class":62,"line":558},[60,2694,561],{"class":153},[60,2696,423],{"class":146},[60,2698,566],{"class":426},[60,2700,157],{"class":146},[60,2702,160],{"class":66},[60,2704,493],{"class":146},[60,2706,147],{"class":146},[60,2708,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745],{"class":62,"line":577},[60,2710,444],{"class":139},[60,2712,582],{"class":254},[60,2714,388],{"class":146},[60,2716,541],{"class":146},[60,2718,101],{"class":254},[60,2720,32],{"class":146},[60,2722,593],{"class":362},[60,2724,423],{"class":153},[60,2726,423],{"class":146},[60,2728,600],{"class":426},[60,2730,493],{"class":146},[60,2732,605],{"class":139},[60,2734,582],{"class":254},[60,2736,32],{"class":146},[60,2738,566],{"class":254},[60,2740,614],{"class":146},[60,2742,454],{"class":254},[60,2744,493],{"class":153},[60,2746,163],{"class":146},[60,2748,2749,2751,2753,2755,2757],{"class":62,"line":623},[60,2750,626],{"class":135},[60,2752,629],{"class":153},[60,2754,600],{"class":254},[60,2756,634],{"class":153},[60,2758,533],{"class":146},[60,2760,2761,2763,2765],{"class":62,"line":639},[60,2762,642],{"class":135},[60,2764,582],{"class":254},[60,2766,163],{"class":146},[60,2768,2769],{"class":62,"line":649},[60,2770,652],{"class":146},[60,2772,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797],{"class":62,"line":655},[60,2774,658],{"class":135},[60,2776,661],{"class":146},[60,2778,255],{"class":362},[60,2780,423],{"class":153},[60,2782,281],{"class":146},[60,2784,670],{"class":70},[60,2786,281],{"class":146},[60,2788,258],{"class":146},[60,2790,261],{"class":254},[60,2792,32],{"class":146},[60,2794,681],{"class":254},[60,2796,493],{"class":153},[60,2798,163],{"class":146},[60,2800,2801],{"class":62,"line":688},[60,2802,511],{"class":146},[60,2804,2805],{"class":62,"line":693},[60,2806,354],{"emptyLinePlaceholder":353},[60,2808,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829],{"class":62,"line":698},[60,2810,701],{"class":153},[60,2812,423],{"class":146},[60,2814,566],{"class":426},[60,2816,157],{"class":146},[60,2818,160],{"class":66},[60,2820,258],{"class":146},[60,2822,714],{"class":426},[60,2824,157],{"class":146},[60,2826,314],{"class":66},[60,2828,493],{"class":146},[60,2830,147],{"class":146},[60,2832,2833,2835,2837,2839,2841,2843,2845,2847],{"class":62,"line":725},[60,2834,444],{"class":139},[60,2836,730],{"class":254},[60,2838,388],{"class":146},[60,2840,541],{"class":146},[60,2842,101],{"class":254},[60,2844,32],{"class":146},[60,2846,741],{"class":362},[60,2848,744],{"class":153},[60,2850,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869],{"class":62,"line":747},[60,2852,750],{"class":146},[60,2854,600],{"class":426},[60,2856,493],{"class":146},[60,2858,605],{"class":139},[60,2860,582],{"class":254},[60,2862,32],{"class":146},[60,2864,566],{"class":254},[60,2866,614],{"class":146},[60,2868,454],{"class":254},[60,2870,769],{"class":146},[60,2872,2873,2875],{"class":62,"line":772},[60,2874,775],{"class":153},[60,2876,163],{"class":146},[60,2878,2879],{"class":62,"line":780},[60,2880,354],{"emptyLinePlaceholder":353},[60,2882,2883,2885,2887,2889,2891,2893,2895,2897],{"class":62,"line":785},[60,2884,626],{"class":135},[60,2886,629],{"class":153},[60,2888,792],{"class":254},[60,2890,795],{"class":146},[60,2892,798],{"class":146},[60,2894,801],{"class":391},[60,2896,634],{"class":153},[60,2898,533],{"class":146},[60,2900,2901,2903,2905,2907,2909,2911,2913,2915],{"class":62,"line":808},[60,2902,811],{"class":146},[60,2904,101],{"class":254},[60,2906,816],{"class":153},[60,2908,792],{"class":254},[60,2910,821],{"class":153},[60,2912,824],{"class":146},[60,2914,714],{"class":254},[60,2916,163],{"class":146},[60,2918,2919,2921,2923],{"class":62,"line":831},[60,2920,642],{"class":135},[60,2922,714],{"class":254},[60,2924,163],{"class":146},[60,2926,2927],{"class":62,"line":840},[60,2928,652],{"class":146},[60,2930,2931,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955],{"class":62,"line":845},[60,2932,658],{"class":135},[60,2934,661],{"class":146},[60,2936,255],{"class":362},[60,2938,423],{"class":153},[60,2940,281],{"class":146},[60,2942,670],{"class":70},[60,2944,281],{"class":146},[60,2946,258],{"class":146},[60,2948,261],{"class":254},[60,2950,32],{"class":146},[60,2952,681],{"class":254},[60,2954,493],{"class":153},[60,2956,163],{"class":146},[60,2958,2959],{"class":62,"line":874},[60,2960,511],{"class":146},[60,2962,2963],{"class":62,"line":879},[60,2964,354],{"emptyLinePlaceholder":353},[60,2966,2967,2969,2971,2973,2975,2977,2979],{"class":62,"line":884},[60,2968,887],{"class":153},[60,2970,423],{"class":146},[60,2972,566],{"class":426},[60,2974,157],{"class":146},[60,2976,160],{"class":66},[60,2978,493],{"class":146},[60,2980,147],{"class":146},[60,2982,2983,2985,2987,2989,2991,2993,2995,2997],{"class":62,"line":902},[60,2984,444],{"class":139},[60,2986,730],{"class":254},[60,2988,388],{"class":146},[60,2990,541],{"class":146},[60,2992,101],{"class":254},[60,2994,32],{"class":146},[60,2996,741],{"class":362},[60,2998,744],{"class":153},[60,3000,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019],{"class":62,"line":921},[60,3002,750],{"class":146},[60,3004,600],{"class":426},[60,3006,493],{"class":146},[60,3008,605],{"class":139},[60,3010,582],{"class":254},[60,3012,32],{"class":146},[60,3014,566],{"class":254},[60,3016,614],{"class":146},[60,3018,454],{"class":254},[60,3020,769],{"class":146},[60,3022,3023,3025],{"class":62,"line":944},[60,3024,775],{"class":153},[60,3026,163],{"class":146},[60,3028,3029],{"class":62,"line":951},[60,3030,354],{"emptyLinePlaceholder":353},[60,3032,3033,3035,3037,3039,3041,3043,3045,3047],{"class":62,"line":956},[60,3034,626],{"class":135},[60,3036,629],{"class":153},[60,3038,792],{"class":254},[60,3040,795],{"class":146},[60,3042,798],{"class":146},[60,3044,801],{"class":391},[60,3046,634],{"class":153},[60,3048,533],{"class":146},[60,3050,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069],{"class":62,"line":975},[60,3052,811],{"class":146},[60,3054,101],{"class":254},[60,3056,32],{"class":146},[60,3058,984],{"class":362},[60,3060,423],{"class":153},[60,3062,792],{"class":254},[60,3064,258],{"class":146},[60,3066,993],{"class":391},[60,3068,493],{"class":153},[60,3070,163],{"class":146},[60,3072,3073],{"class":62,"line":1000},[60,3074,652],{"class":146},[60,3076,3077,3079,3081,3083,3085,3087,3089,3091,3093,3095,3097,3099,3101],{"class":62,"line":1005},[60,3078,658],{"class":135},[60,3080,661],{"class":146},[60,3082,255],{"class":362},[60,3084,423],{"class":153},[60,3086,281],{"class":146},[60,3088,670],{"class":70},[60,3090,281],{"class":146},[60,3092,258],{"class":146},[60,3094,261],{"class":254},[60,3096,32],{"class":146},[60,3098,681],{"class":254},[60,3100,493],{"class":153},[60,3102,163],{"class":146},[60,3104,3105],{"class":62,"line":1034},[60,3106,511],{"class":146},[60,3108,3109],{"class":62,"line":1039},[60,3110,230],{"class":146},[15,3112,3113],{},"Notice that our product service class implements the five CRUD methods which are:",[1046,3115,3116,3119,3122,3125,3128],{},[1049,3117,3118],{},"create: to create a new product resource",[1049,3120,3121],{},"findAll: to retrieve all products",[1049,3123,3124],{},"finOne: to retrieve one product by its ID",[1049,3126,3127],{},"update: to update a product resource",[1049,3129,3130],{},"delete: to delete a product",[1080,3132,1083],{"id":1082},[15,3134,3135],{},"In essence, DTOs help control and validate data when creating or updating resources in a NestJS application, ensuring\nthat the data adheres to specific rules and constraints.",[1088,3137,1091],{"id":1090},[15,3139,3140],{},"They define the structure of incoming data when creating a resource. This helps validate and format the data before it's\nprocessed.",[49,3142,3143],{"className":125,"code":1097,"filename":1098,"language":128,"meta":55,"style":55},[57,3144,3145,3155,3165,3175,3185,3195,3205],{"__ignoreMap":55},[60,3146,3147,3149,3151,3153],{"class":62,"line":63},[60,3148,136],{"class":135},[60,3150,140],{"class":139},[60,3152,292],{"class":66},[60,3154,147],{"class":146},[60,3156,3157,3159,3161,3163],{"class":62,"line":150},[60,3158,169],{"class":153},[60,3160,157],{"class":146},[60,3162,174],{"class":66},[60,3164,163],{"class":146},[60,3166,3167,3169,3171,3173],{"class":62,"line":166},[60,3168,182],{"class":153},[60,3170,157],{"class":146},[60,3172,174],{"class":66},[60,3174,163],{"class":146},[60,3176,3177,3179,3181,3183],{"class":62,"line":179},[60,3178,194],{"class":153},[60,3180,157],{"class":146},[60,3182,174],{"class":66},[60,3184,163],{"class":146},[60,3186,3187,3189,3191,3193],{"class":62,"line":191},[60,3188,206],{"class":153},[60,3190,157],{"class":146},[60,3192,160],{"class":66},[60,3194,163],{"class":146},[60,3196,3197,3199,3201,3203],{"class":62,"line":203},[60,3198,218],{"class":153},[60,3200,157],{"class":146},[60,3202,174],{"class":66},[60,3204,163],{"class":146},[60,3206,3207],{"class":62,"line":215},[60,3208,230],{"class":146},[1088,3210,1168],{"id":1167},[15,3212,3213],{},"They specify the allowed fields for updating a resource, ensuring that only valid data can be modified, enhancing data\nintegrity and security.",[49,3215,3216],{"className":125,"code":1174,"filename":1175,"language":128,"meta":55,"style":55},[57,3217,3218,3238,3258,3262,3278,3288],{"__ignoreMap":55},[60,3219,3220,3222,3224,3226,3228,3230,3232,3234,3236],{"class":62,"line":63},[60,3221,248],{"class":135},[60,3223,251],{"class":146},[60,3225,1186],{"class":254},[60,3227,269],{"class":146},[60,3229,272],{"class":135},[60,3231,275],{"class":146},[60,3233,1195],{"class":70},[60,3235,281],{"class":146},[60,3237,163],{"class":146},[60,3239,3240,3242,3244,3246,3248,3250,3252,3254,3256],{"class":62,"line":150},[60,3241,248],{"class":135},[60,3243,251],{"class":146},[60,3245,292],{"class":254},[60,3247,269],{"class":146},[60,3249,272],{"class":135},[60,3251,275],{"class":146},[60,3253,1216],{"class":70},[60,3255,281],{"class":146},[60,3257,163],{"class":146},[60,3259,3260],{"class":62,"line":166},[60,3261,354],{"emptyLinePlaceholder":353},[60,3263,3264,3266,3268,3270,3272,3274,3276],{"class":62,"line":179},[60,3265,136],{"class":135},[60,3267,140],{"class":139},[60,3269,314],{"class":66},[60,3271,1235],{"class":139},[60,3273,1186],{"class":362},[60,3275,1240],{"class":254},[60,3277,533],{"class":146},[60,3279,3280,3282,3284,3286],{"class":62,"line":191},[60,3281,154],{"class":153},[60,3283,157],{"class":146},[60,3285,160],{"class":66},[60,3287,163],{"class":146},[60,3289,3290],{"class":62,"line":203},[60,3291,230],{"class":146},[10,3293,1399],{"id":3294},"controller",[15,3296,3297],{},"Controllers are un charge of receiving incoming requests and responding to the client. The main purpose of a controller\nis to receive particular requests for the application. Each controller frequently has more than one route, and distinct\nroutes might perform various actions.",[15,3299,3300],{},"Let's now see what our product controller looks like.",[49,3302,3303],{"className":125,"code":1273,"filename":1274,"language":128,"meta":55,"style":55},[57,3304,3305,3349,3369,3389,3409,3413,3429,3439,3459,3463,3467,3475,3495,3515,3519,3523,3531,3539,3555,3559,3563,3579,3607,3629,3633,3637,3653,3695,3721,3725,3729,3745,3773,3795,3799],{"__ignoreMap":55},[60,3306,3307,3309,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337,3339,3341,3343,3345,3347],{"class":62,"line":63},[60,3308,248],{"class":135},[60,3310,251],{"class":146},[60,3312,1285],{"class":254},[60,3314,258],{"class":146},[60,3316,1290],{"class":254},[60,3318,258],{"class":146},[60,3320,1295],{"class":254},[60,3322,258],{"class":146},[60,3324,1300],{"class":254},[60,3326,258],{"class":146},[60,3328,1305],{"class":254},[60,3330,258],{"class":146},[60,3332,1310],{"class":254},[60,3334,258],{"class":146},[60,3336,1315],{"class":254},[60,3338,269],{"class":146},[60,3340,272],{"class":135},[60,3342,275],{"class":146},[60,3344,278],{"class":70},[60,3346,281],{"class":146},[60,3348,163],{"class":146},[60,3350,3351,3353,3355,3357,3359,3361,3363,3365,3367],{"class":62,"line":150},[60,3352,248],{"class":135},[60,3354,251],{"class":146},[60,3356,375],{"class":254},[60,3358,269],{"class":146},[60,3360,272],{"class":135},[60,3362,275],{"class":146},[60,3364,1344],{"class":70},[60,3366,281],{"class":146},[60,3368,163],{"class":146},[60,3370,3371,3373,3375,3377,3379,3381,3383,3385,3387],{"class":62,"line":166},[60,3372,248],{"class":135},[60,3374,251],{"class":146},[60,3376,292],{"class":254},[60,3378,269],{"class":146},[60,3380,272],{"class":135},[60,3382,275],{"class":146},[60,3384,301],{"class":70},[60,3386,281],{"class":146},[60,3388,163],{"class":146},[60,3390,3391,3393,3395,3397,3399,3401,3403,3405,3407],{"class":62,"line":179},[60,3392,248],{"class":135},[60,3394,251],{"class":146},[60,3396,314],{"class":254},[60,3398,269],{"class":146},[60,3400,272],{"class":135},[60,3402,275],{"class":146},[60,3404,323],{"class":70},[60,3406,281],{"class":146},[60,3408,163],{"class":146},[60,3410,3411],{"class":62,"line":191},[60,3412,354],{"emptyLinePlaceholder":353},[60,3414,3415,3417,3419,3421,3423,3425,3427],{"class":62,"line":203},[60,3416,359],{"class":146},[60,3418,1399],{"class":362},[60,3420,423],{"class":254},[60,3422,281],{"class":146},[60,3424,101],{"class":70},[60,3426,281],{"class":146},[60,3428,1410],{"class":254},[60,3430,3431,3433,3435,3437],{"class":62,"line":215},[60,3432,136],{"class":135},[60,3434,140],{"class":139},[60,3436,1419],{"class":66},[60,3438,147],{"class":146},[60,3440,3441,3443,3445,3447,3449,3451,3453,3455,3457],{"class":62,"line":227},[60,3442,1426],{"class":139},[60,3444,423],{"class":146},[60,3446,1431],{"class":139},[60,3448,1434],{"class":139},[60,3450,1437],{"class":426},[60,3452,157],{"class":146},[60,3454,375],{"class":66},[60,3456,493],{"class":146},[60,3458,147],{"class":146},[60,3460,3461],{"class":62,"line":397},[60,3462,511],{"class":146},[60,3464,3465],{"class":62,"line":412},[60,3466,354],{"emptyLinePlaceholder":353},[60,3468,3469,3471,3473],{"class":62,"line":417},[60,3470,1458],{"class":146},[60,3472,1461],{"class":362},[60,3474,366],{"class":254},[60,3476,3477,3479,3481,3483,3485,3487,3489,3491,3493],{"class":62,"line":441},[60,3478,420],{"class":153},[60,3480,1470],{"class":146},[60,3482,1473],{"class":362},[60,3484,1476],{"class":254},[60,3486,427],{"class":426},[60,3488,157],{"class":146},[60,3490,292],{"class":66},[60,3492,493],{"class":146},[60,3494,147],{"class":146},[60,3496,3497,3499,3501,3503,3505,3507,3509,3511,3513],{"class":62,"line":475},[60,3498,501],{"class":135},[60,3500,541],{"class":146},[60,3502,1495],{"class":254},[60,3504,32],{"class":146},[60,3506,1053],{"class":362},[60,3508,423],{"class":153},[60,3510,427],{"class":254},[60,3512,493],{"class":153},[60,3514,163],{"class":146},[60,3516,3517],{"class":62,"line":498},[60,3518,511],{"class":146},[60,3520,3521],{"class":62,"line":508},[60,3522,354],{"emptyLinePlaceholder":353},[60,3524,3525,3527,3529],{"class":62,"line":514},[60,3526,1458],{"class":146},[60,3528,1522],{"class":362},[60,3530,366],{"class":254},[60,3532,3533,3535,3537],{"class":62,"line":519},[60,3534,522],{"class":153},[60,3536,1531],{"class":146},[60,3538,147],{"class":146},[60,3540,3541,3543,3545,3547,3549,3551,3553],{"class":62,"line":536},[60,3542,501],{"class":135},[60,3544,541],{"class":146},[60,3546,1495],{"class":254},[60,3548,32],{"class":146},[60,3550,1059],{"class":362},[60,3552,1531],{"class":153},[60,3554,163],{"class":146},[60,3556,3557],{"class":62,"line":548},[60,3558,511],{"class":146},[60,3560,3561],{"class":62,"line":553},[60,3562,354],{"emptyLinePlaceholder":353},[60,3564,3565,3567,3569,3571,3573,3575,3577],{"class":62,"line":558},[60,3566,1458],{"class":146},[60,3568,1522],{"class":362},[60,3570,423],{"class":254},[60,3572,281],{"class":146},[60,3574,1570],{"class":70},[60,3576,281],{"class":146},[60,3578,1410],{"class":254},[60,3580,3581,3583,3585,3587,3589,3591,3593,3595,3597,3599,3601,3603,3605],{"class":62,"line":577},[60,3582,561],{"class":153},[60,3584,1470],{"class":146},[60,3586,1583],{"class":362},[60,3588,423],{"class":254},[60,3590,281],{"class":146},[60,3592,566],{"class":70},[60,3594,281],{"class":146},[60,3596,634],{"class":254},[60,3598,566],{"class":426},[60,3600,157],{"class":146},[60,3602,174],{"class":66},[60,3604,493],{"class":146},[60,3606,147],{"class":146},[60,3608,3609,3611,3613,3615,3617,3619,3621,3623,3625,3627],{"class":62,"line":623},[60,3610,501],{"class":135},[60,3612,541],{"class":146},[60,3614,1495],{"class":254},[60,3616,32],{"class":146},[60,3618,1065],{"class":362},[60,3620,423],{"class":153},[60,3622,1620],{"class":146},[60,3624,566],{"class":254},[60,3626,493],{"class":153},[60,3628,163],{"class":146},[60,3630,3631],{"class":62,"line":639},[60,3632,511],{"class":146},[60,3634,3635],{"class":62,"line":649},[60,3636,354],{"emptyLinePlaceholder":353},[60,3638,3639,3641,3643,3645,3647,3649,3651],{"class":62,"line":655},[60,3640,1458],{"class":146},[60,3642,1641],{"class":362},[60,3644,423],{"class":254},[60,3646,281],{"class":146},[60,3648,1570],{"class":70},[60,3650,281],{"class":146},[60,3652,1410],{"class":254},[60,3654,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3693],{"class":62,"line":688},[60,3656,701],{"class":153},[60,3658,1470],{"class":146},[60,3660,1583],{"class":362},[60,3662,423],{"class":254},[60,3664,281],{"class":146},[60,3666,566],{"class":70},[60,3668,281],{"class":146},[60,3670,634],{"class":254},[60,3672,566],{"class":426},[60,3674,157],{"class":146},[60,3676,174],{"class":66},[60,3678,258],{"class":146},[60,3680,1680],{"class":146},[60,3682,1473],{"class":362},[60,3684,1476],{"class":254},[60,3686,1687],{"class":426},[60,3688,157],{"class":146},[60,3690,314],{"class":66},[60,3692,493],{"class":146},[60,3694,147],{"class":146},[60,3696,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3717,3719],{"class":62,"line":693},[60,3698,501],{"class":135},[60,3700,541],{"class":146},[60,3702,1495],{"class":254},[60,3704,32],{"class":146},[60,3706,1071],{"class":362},[60,3708,423],{"class":153},[60,3710,1620],{"class":146},[60,3712,566],{"class":254},[60,3714,258],{"class":146},[60,3716,714],{"class":254},[60,3718,493],{"class":153},[60,3720,163],{"class":146},[60,3722,3723],{"class":62,"line":698},[60,3724,511],{"class":146},[60,3726,3727],{"class":62,"line":725},[60,3728,354],{"emptyLinePlaceholder":353},[60,3730,3731,3733,3735,3737,3739,3741,3743],{"class":62,"line":747},[60,3732,1458],{"class":146},[60,3734,1736],{"class":362},[60,3736,423],{"class":254},[60,3738,281],{"class":146},[60,3740,1570],{"class":70},[60,3742,281],{"class":146},[60,3744,1410],{"class":254},[60,3746,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3767,3769,3771],{"class":62,"line":772},[60,3748,887],{"class":153},[60,3750,1470],{"class":146},[60,3752,1583],{"class":362},[60,3754,423],{"class":254},[60,3756,281],{"class":146},[60,3758,566],{"class":70},[60,3760,281],{"class":146},[60,3762,634],{"class":254},[60,3764,566],{"class":426},[60,3766,157],{"class":146},[60,3768,174],{"class":66},[60,3770,493],{"class":146},[60,3772,147],{"class":146},[60,3774,3775,3777,3779,3781,3783,3785,3787,3789,3791,3793],{"class":62,"line":780},[60,3776,501],{"class":135},[60,3778,541],{"class":146},[60,3780,1495],{"class":254},[60,3782,32],{"class":146},[60,3784,1787],{"class":362},[60,3786,423],{"class":153},[60,3788,1620],{"class":146},[60,3790,566],{"class":254},[60,3792,493],{"class":153},[60,3794,163],{"class":146},[60,3796,3797],{"class":62,"line":785},[60,3798,511],{"class":146},[60,3800,3801],{"class":62,"line":808},[60,3802,230],{"class":146},[15,3804,3805,3806,3808,3809,3811,3812,3814],{},"The first thing we note is that NestJS makes extensive use of decorators. The ",[57,3807,1815],{}," decorator is used to\nindicate that a class is a controller. In the above example, we utilized the ",[57,3810,1815],{}," decorator, which is\nrequired to construct a basic controller with a parameter ",[1821,3813,101],{}," which represents the route path. Please notice that\nif you do not provide any value in the parameter, the controller will be accessible from the host with no need to\nprovide any pathname",[1080,3816,1827],{"id":1826},[15,3818,3819,1834,3821,1834,3823,3825,3826,3828],{},[57,3820,1833],{},[57,3822,1837],{},[57,3824,1840],{},", and ",[57,3827,1844],{}," HTTP request method before the controller class methods tells NestJS\ncreating a handler for the equivalent endpoint for Http requests. The endpoint corresponds to the HTTP request method\nand the route path.",[1080,3830,3832],{"id":3831},"body-request-and-query-param","Body request and Query Param",[15,3834,3835,3836,3838],{},"We need to access the content of a request when handling POST and PUT in the controller above. NestJS includes\na ",[57,3837,1855],{}," decorator that allows us to easily access the Http request body. We previously introduced the concept of a\nData Transfer Object (DTO). It helps to control and validate data when creating or updating resources.",[15,3840,3841,3842,3844],{},"Meanwhile, we should notice the ",[57,3843,1862],{}," decorator which is used to tell NestJS that our path has a query\nparameter named id, and should be provided when the request is sent.",[10,3846,1870],{"id":1869},[15,3848,3849,3850,3852,3853,3855],{},"A module is a class that has been annotated with the ",[57,3851,1876],{}," decorator. Nest uses the metadata provided by the\n",[57,3854,1876],{}," decorator to organize the application structure.",[15,3857,3858],{},"Each application contains at least one module, known as the root module. Nest builds the application graph from the root\nmodule, which is the internal data structure Nest utilizes to resolve module and provider interactions and dependencies.\nWhile very small programs may theoretically contain only the root module, this is not the norm.",[15,3860,3861],{},"Lets what the product module looks like:",[49,3863,3864],{"className":125,"code":1893,"filename":1894,"language":128,"meta":55,"style":55},[57,3865,3866,3886,3906,3926,3930,3940,3950,3960,3966,3976],{"__ignoreMap":55},[60,3867,3868,3870,3872,3874,3876,3878,3880,3882,3884],{"class":62,"line":63},[60,3869,248],{"class":135},[60,3871,251],{"class":146},[60,3873,1905],{"class":254},[60,3875,269],{"class":146},[60,3877,272],{"class":135},[60,3879,275],{"class":146},[60,3881,278],{"class":70},[60,3883,281],{"class":146},[60,3885,163],{"class":146},[60,3887,3888,3890,3892,3894,3896,3898,3900,3902,3904],{"class":62,"line":150},[60,3889,248],{"class":135},[60,3891,251],{"class":146},[60,3893,375],{"class":254},[60,3895,269],{"class":146},[60,3897,272],{"class":135},[60,3899,275],{"class":146},[60,3901,1344],{"class":70},[60,3903,281],{"class":146},[60,3905,163],{"class":146},[60,3907,3908,3910,3912,3914,3916,3918,3920,3922,3924],{"class":62,"line":166},[60,3909,248],{"class":135},[60,3911,251],{"class":146},[60,3913,1419],{"class":254},[60,3915,269],{"class":146},[60,3917,272],{"class":135},[60,3919,275],{"class":146},[60,3921,1954],{"class":70},[60,3923,281],{"class":146},[60,3925,163],{"class":146},[60,3927,3928],{"class":62,"line":179},[60,3929,354],{"emptyLinePlaceholder":353},[60,3931,3932,3934,3936,3938],{"class":62,"line":191},[60,3933,359],{"class":146},[60,3935,1870],{"class":362},[60,3937,423],{"class":254},[60,3939,533],{"class":146},[60,3941,3942,3944,3946,3948],{"class":62,"line":203},[60,3943,1977],{"class":153},[60,3945,157],{"class":146},[60,3947,1982],{"class":254},[60,3949,769],{"class":146},[60,3951,3952,3954,3956,3958],{"class":62,"line":215},[60,3953,1989],{"class":153},[60,3955,157],{"class":146},[60,3957,1994],{"class":254},[60,3959,769],{"class":146},[60,3961,3962,3964],{"class":62,"line":227},[60,3963,2001],{"class":146},[60,3965,1410],{"class":254},[60,3967,3968,3970,3972,3974],{"class":62,"line":397},[60,3969,136],{"class":135},[60,3971,140],{"class":139},[60,3973,2012],{"class":66},[60,3975,147],{"class":146},[60,3977,3978],{"class":62,"line":412},[60,3979,230],{"class":146},[15,3981,3982,3983,3985],{},"The ",[57,3984,1876],{}," decorator takes a single object whose properties describe the module:",[1046,3987,3988,3991,3994,3997],{},[1049,3989,3990],{},"controllers: the set of controllers defined in this module which have to be instantiated",[1049,3992,3993],{},"providers: the providers that will be instantiated by the Nest injector and that may be shared at least across this\nmodule",[1049,3995,3996],{},"imports: the list of imported modules that export the providers which are required in this module",[1049,3998,3999],{},"exports: he subset of providers that are provided by this module and should be available in other modules which import\nthis module.",[15,4001,4002],{},"Finally, let's take a look at the app.module.ts file:",[49,4004,4005],{"className":2059,"code":2060,"filename":105,"language":2061,"meta":55,"style":55},[57,4006,4007,4027,4047,4067,4087,4091,4101,4111,4121,4131,4137,4147],{"__ignoreMap":55},[60,4008,4009,4011,4013,4015,4017,4019,4021,4023,4025],{"class":62,"line":63},[60,4010,248],{"class":135},[60,4012,251],{"class":146},[60,4014,1905],{"class":254},[60,4016,269],{"class":146},[60,4018,272],{"class":135},[60,4020,275],{"class":146},[60,4022,278],{"class":70},[60,4024,281],{"class":146},[60,4026,163],{"class":146},[60,4028,4029,4031,4033,4035,4037,4039,4041,4043,4045],{"class":62,"line":150},[60,4030,248],{"class":135},[60,4032,251],{"class":146},[60,4034,2092],{"class":254},[60,4036,269],{"class":146},[60,4038,272],{"class":135},[60,4040,275],{"class":146},[60,4042,2101],{"class":70},[60,4044,281],{"class":146},[60,4046,163],{"class":146},[60,4048,4049,4051,4053,4055,4057,4059,4061,4063,4065],{"class":62,"line":166},[60,4050,248],{"class":135},[60,4052,251],{"class":146},[60,4054,2114],{"class":254},[60,4056,269],{"class":146},[60,4058,272],{"class":135},[60,4060,275],{"class":146},[60,4062,2123],{"class":70},[60,4064,281],{"class":146},[60,4066,163],{"class":146},[60,4068,4069,4071,4073,4075,4077,4079,4081,4083,4085],{"class":62,"line":179},[60,4070,248],{"class":135},[60,4072,251],{"class":146},[60,4074,2012],{"class":254},[60,4076,269],{"class":146},[60,4078,272],{"class":135},[60,4080,275],{"class":146},[60,4082,2144],{"class":70},[60,4084,281],{"class":146},[60,4086,163],{"class":146},[60,4088,4089],{"class":62,"line":191},[60,4090,354],{"emptyLinePlaceholder":353},[60,4092,4093,4095,4097,4099],{"class":62,"line":203},[60,4094,359],{"class":146},[60,4096,1870],{"class":362},[60,4098,423],{"class":254},[60,4100,533],{"class":146},[60,4102,4103,4105,4107,4109],{"class":62,"line":215},[60,4104,2167],{"class":153},[60,4106,157],{"class":146},[60,4108,2172],{"class":254},[60,4110,769],{"class":146},[60,4112,4113,4115,4117,4119],{"class":62,"line":227},[60,4114,1977],{"class":153},[60,4116,157],{"class":146},[60,4118,2183],{"class":254},[60,4120,769],{"class":146},[60,4122,4123,4125,4127,4129],{"class":62,"line":397},[60,4124,1989],{"class":153},[60,4126,157],{"class":146},[60,4128,2194],{"class":254},[60,4130,769],{"class":146},[60,4132,4133,4135],{"class":62,"line":412},[60,4134,2001],{"class":146},[60,4136,1410],{"class":254},[60,4138,4139,4141,4143,4145],{"class":62,"line":417},[60,4140,136],{"class":135},[60,4142,140],{"class":139},[60,4144,2211],{"class":66},[60,4146,147],{"class":146},[60,4148,4149],{"class":62,"line":441},[60,4150,230],{"class":146},[15,4152,4153],{},"Now, what else? Maybe start the dev server? Sure! Here is how to start",[79,4155],{"alt":4156,"source":2224},"Start nestjs server",[15,4158,4159,4160],{},"Here we are, everything is now allowing you to manage a small CRUD of products for an e-commerce site catalog. I share\nthe postman collection with you to test endpoints in your environment.\n",[25,4161,4163],{"href":2230,"rel":4162},[29],[2233,4164],{"alt":2235,"src":2236},[10,4166,4168],{"id":4167},"summary","Summary",[15,4170,4171],{},"We've just scratched the surface of NestJs in this essay. We now understand what a Controller is and how to manage basic\nrouting in our application. We've also briefly discussed Services and Modules. In the following sections of this series,\nwe will spend a significant amount of time studying the application structure in NestJS.",[15,4173,4174],{},"All the information presented above is only the top of the NestJS iceberg. Hopefully, it has persuaded you that it is\nworthwhile to investigate this framework because it offers a lot of value. There's a lot to say about Nest's features,\nsuch as clean error handling and dependency injection. We'll also go over the PostgresSQL database and how to use it\nusing ORM, and of course we will talk about authentication and authorization with NestJS.",[15,4176,4177],{},"Stay tuned !!",[2251,4179,2253],{},{"title":55,"searchDepth":150,"depth":150,"links":4181},[4182,4183,4184,4185,4188,4192,4193],{"id":12,"depth":150,"text":13},{"id":2307,"depth":150,"text":2308},{"id":2350,"depth":150,"text":2351},{"id":233,"depth":150,"text":234,"children":4186},[4187],{"id":1082,"depth":166,"text":1083},{"id":3294,"depth":150,"text":1399,"children":4189},[4190,4191],{"id":1826,"depth":166,"text":1827},{"id":3831,"depth":166,"text":3832},{"id":1869,"depth":150,"text":1870},{"id":4167,"depth":150,"text":4168},"Learn about the essential components of NestJS for building scalable server-side apps. Examine the functions of services, modules, and controllers while using the capabilities of DTOs (Data Transfer Objects) for data validation and increased security.",{},"\u002Fbackend\u002Fnest-js\u002Funderstanding-services-modules-and-controllers",{"title":2287,"description":4194},"2.backend\u002F1.nest-js\u002F2.understanding-services-modules-and-controllers",[2278,2279,2280],[2282,2283],"bSeFodw0jQo6aWD53pqydge4JCY28DW5iLtLg-k7jOQ",[4203,4206],{"title":4204,"path":4205},"Maîtriser NestJS : ton guide ultime du développement backend moderne","\u002Fbackend\u002Fnest-js\u002Fintroducing-nest-js.fr",{"title":4207,"path":4208},"Maîtriser NestJS : connecter NestJS à une base PostgreSQL","\u002Fbackend\u002Fnest-js\u002Fconecting-nestjs-to-postgres-database.fr",[4210,4217,4222],{"path":4211,"title":4212,"description":4213,"date":4214,"tags":4215,"topics":4216},"\u002Fbackend\u002Fnest-js\u002Funlocking-the-power-of-relationships-with-typeorm.fr","Maîtriser NestJS : libérer la puissance des relations avec TypeORM et les bases SQL","Libère la puissance des relations de données avec NestJS, TypeORM et les bases SQL. Maîtrise l'art de construire des structures de données complexes et des interactions fluides. Idéal pour les développeurs NestJS expérimentés comme pour les débutants qui veulent créer des applications à la pointe.","2023-10-18",[2278,2279,2280],[2282,2283],{"path":4208,"title":4207,"description":4218,"date":4219,"tags":4220,"topics":4221},"Apprends les étapes essentielles pour maîtriser NestJS et tirer parti de TypeORM pour une connectivité base de données robuste dans tes projets.","2023-09-06",[2278,2279,2280],[2283,2282],{"path":4205,"title":4204,"description":4223,"date":4224,"tags":4225,"topics":4226},"Explore NestJS, un framework Node.js moderne, dans cette introduction complète. Rejoins notre série pour maîtriser l'architecture modulaire, les contrôleurs, providers, services, et plus encore. Construis des applications backend scalables en toute confiance. Bienvenue dans la partie 1 de la série NestJS !","2023-08-23",[2278,2279,2280],[2282,2283],1780074489756]