v4 0 nest js basic docs thuc tap tot nghiep

190 0 0
Tài liệu đã được kiểm tra trùng lặp
v4 0 nest js basic docs thuc tap tot nghiep

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giới thiệu về khóa học và tác giả, cũng như demo kết quả đạt được sau khi kết thúc khóahọc này.- Hiểurõ,thựchànhvàápdụngđượcngônngữTypescriptchodựánNestJS- XâydựngtưduyBackendvớitính“mởr

Trang 1

about:blank 1/190TÀILIỆUKHÓAHỌC“Nest.JSvớiTypeScript/MongoDBSiêuDễ”

- Thêmtómtắtchocácchươngtàiliệu.

Trang 6

Giới thiệu về khóa học và tác giả, cũng như demo kết quả đạt được sau khi kết thúc khóahọc này.

- Hiểurõ,thựchànhvàápdụngđượcngônngữTypescriptchodựánNestJS- XâydựngtưduyBackendvớitính“mởrộng”cao,bằngcáchhọc&sửdụng

- Thựchànhdựánviếtbackendchowebsitecloneitviec.com(websiteđăngtin/ứngtuyểnviệclàm)

Trang 7

about:blank 7/190#0.2.YêuCầuCủaKhóaHọc

- CầncósựhiểubiếtcơbảnvềTypescript.Nếubạnchưabiết,cóthểhọcnhanhtạiđây:

- CầncókiếnthứcvềMongoDB(sửdụngvớiMongoose).Nếuchưabiết,bạncóthểthamkhảokhóahọcnày:

- CàiđặtmôitrườngNode.JS:trongkhóahọcnày,máytínhcủamìnhdùngversionNode.JS16.20.0

- CàiđặtGit:cácthaotácvớiGitvàsửdụngGithub,mìnhkhônghướngdẫn.BạnnàochưabiếtdùngGit,xemtạiđây:

- CàiđặtVisualStudioCode:đâylàcôngcụdùngđểcode

6

Trang 8

VớicácbạnhọcviênUdemy,đểđảmbảoquyềnlợi,cácbạnchủđộnginboxquafanpageHỏiDânITđểnhậnđượcsựhỗtrợtrongquátrìnhhọctậpnhé:https://www.facebook.com/askITwithERIC/

Trang 9

about:blank 9/1904.Vềchuyệnleakkhóahọcvàmualậu

VỚICÁCBẠNMUALẬU,MÌNHCHỈMUỐNCHIASẺTHẾNÀY:1 TRÊNĐỜINÀY,CHẲNGCÓGÌCHẤTLƯỢNGMÀMIỄNPHÍCẢ.

2 HÃYHỌCTHÓIQUENTRÂNTRỌNGGIÁTRỊLAOĐỘNG

NÓLÀTHÓIQUEN,CŨNGNHƯSẼLÀMỘTPHẦNTÍNHCÁCHCỦABẠN.ĐỪNGVÌNGHÈOQUÁMÀLÀMMẤTĐITÍNHCÁCHCỦABẢNTHÂN.NẾUKHÓKHĂN,CỨINBOXMÌNH,MÌNHHỖTRỢ.VIỆCGÌPHẢILÀMVẬY=))3 MÌNHĐÃTỪNGLÀSINHVIÊNGIỐNGBẠN,MÌNHHIỂUTẠISAOCÁCBẠNLÀM

VẬY HÃYBIẾTCHOĐI.SỐNGÍCHKỶ,THÌTHEOLUẬTNHÂNQUẢĐẤY,CHẲNGCÓGÌLÀNGẪUNHIÊNCẢ

4 NẾUBẠNTHẤYKHÓAHỌCHAY,HÃYBIẾTDONATEĐỂỦNGHỘTÁCGIẢ.LINKDONATE:https://hoidanit.github.io/official/donate

8

Trang 10

Youtube“HỏiDânIT”:https://www.youtube.com/@hoidanitTiktok“HỏiDânIT”:https://www.tiktok.com/@hoidanitFanpage“HỏiDânIT”:https://www.facebook.com/askITwithERIC/UdemyHỏiDânIT:https://www.udemy.com/user/eric-7039/

Trang 11

about:blank 11/190Chapter1:TổngquanvềNest.JS

Giới thiệu tổng quan về Framework Nest.js và trả lời câu hỏi, tại sao chúng ta lại cầnNest.JS, từ đấy viết chương trình Hello World với Framework này.

+ OOP(ObjectOrientedProgramming-lậptrìnhhướngđốitượng)

+ FP(FunctionalProgramming),tươngtựnhưfunctioncomponent(khidùngvớiReact.js)

+ FRP(FunctionalReactiveProgramming)(tươngtựrxjscủaangular)

10

Trang 12

Nest.jssẽcungcấpbộkhungframework(architecture-kiếntrúc),việccủachúngtalàsửdụngbộkhungđấyđểbuildsảnphẩmmìnhmuốn.

Trang 13

about:blank 13/190#2.CreateANewProject

Lưuý:môitrườngcàiđặtNode.js16.xgulp'CàiđặtNestCLI: npmi-g@nestjs/cli@9.4.2

12

Trang 14

+ filemain.tslàfilechính.ứngdụngNest.jssẽchạyfilenàyđầutiên(tươngtựfileserver.jstrongkhóahọcrestfulapi)

Trang 15

about:blank 15/190-Cácfilephụ:

14

Trang 16

- Cầnchiatheomodule,đểcóthểpháttriểnđộclập,đồngthời,tínhnăngnàysẽítảnhhưởngtớitínhnăngkia(on/offtheoýmuốn)

Filemain.tssẽchạyappmodules,vàappmodulessẽbaogồmtấtcảcácmodulescon.

Vídụ:đểkếtnốitớidatabase,UsersModulescóthểbaogồmDatabaseModules

Trang 17

about:blank 17/190Chapter2:NestJSvàTypescript

Tìm hiểu và học cách sử dụng Decorator của Typescript vào Nest.JS, từ đấy nắm vữngcách hoạt động Router và Controller khi sử dụng các Decorator có sẵn do Nest.JS cungcấp.

16

Trang 18

}

Trang 19

about:blank 19/190#6.SửdụngDecoratorvớiNest.JS

18

Trang 20

classExampleClass{@decorate1( )@decorate2method(){

tạisaolạisửdụng:@decorate1() =>cầndấu()và @decorate2=>khôngcần()=>phụthuộcvàocáchviếtdecorator

Vídụ:@Controller(),@Injectable()

Trang 21

about:blank 21/190#7.MôhìnhRoutervớiNest.JS

20

Trang 22

}

Trang 23

about:blank 23/1902.CáchxửlýcủaNest.JS

@Controller()//khôngcóthamsố@Get('/order') //GET/order

@Controller('order)@Get() //GET/order

22

Trang 24

@Get() nếubạnkhôngtruyênthamsố=>sinhraGET"/"@Get("/path") nếubạntruyênthamsố=>sinhraGET"/path"

@Get('/user) =>sinhraroute"/user"

@Get('/filter-by-name) =>sinhraroute"/user1/filter-by-name"

Trang 25

about:blank 25/190Chapter3: InversionOfControl

Khi Học về OOP (lập trình hướng đối tượng), một trong các cách dùng để tối ưu hóa ứngdụng là áp dụng mô hình IoC(Inversion of control) và DI (Dependency injection) Chươngnày sẽ giúp chúng ta học cách sử dụng các “design pattern” trên vào framework Nest.JSLưuý:

24

Trang 26

}

Trang 27

about:blank 27/190publicclassB{

26

Trang 28

Minhhọa=hìnhcáicây(tree).Cácmoduleschínhlàcáclácủa1cáicây.Lánàyrụngsẽkhônglàmảnhhưởngtớicây,haycáclácònlại.

Trang 29

about:blank 29/190Ứngdụngtrongthựctế:

28

Trang 30

còn1thànhphần,gọilàinjector(giúptạoraDI,vàlàmchoclassAvàBkhôngphụthuộcvàonhau:v)

Trang 31

about:blank 31/1902.Vídụvềphạmvi(scope)vàcáchsửdụngDI

30

Trang 32

}

Trang 33

about:blank 33/190Chapter4:NestJSvàMVC

NestJS cũng có đủ khả năng và sức mạnh để làm Server theo mô hình MVC truyền thống.Tại đây, chúng ta sẽ tìm hiểu về View Engine, cách viết code theo mô hình

Model-View-Controller và các nhược điểm đang còn tồn đọng của mô hình này.#12.Vídụvềcontroller/service

32

Trang 34

#14.MôhìnhMVC-KhôngcóModel?

Trang 35

about:blank 35/190#15.VấnĐềtồnđọngvớiSSR?

34

Trang 37

about:blank 37/190Chapter5:ConnectDatabase

Trong chương này, chúng ta sẽ cùng nhau kết nối backend tới Database bằng cách sửdụng MongoDB Ngoài ra, sẽ tối ưu hóa cách sử dụng “hằng số”, dựa vào cách sử dụngtham số môi trường (.env) với Nest.JS Config.

36

Trang 38

CàiđặtMongoDBServerhoặctạotàikhoảnvàsửdụngdatabaseAtlasonline

Trang 39

about:blank 39/190#18.SửdụngMongoDBvớiNestJS

38

Trang 40

- Nhiềuhơn1file.env,vídụmỗimôitrườngsửdụnglà1file.envMôitrườngtest:.env.test

- Chúngtamuốnvalidatedữliệucủabiếntrong.env.Cáchlàmtruyềnthống,sửdụngtrựctiếp.envlàkhônglàmđược

Vềbảnchất,ConfigServicecũngsửdụngthưviện.env,tuynhiên,nóđã“codethêm”đểgiảiquyết2vấnđềchúngtanêuởtrên(sửdụngnhiềufile.envvàvalidatefile.env)

Trang 41

about:blank 41/1903.SửdụngConfigService

Tàiliệu:https://docs.nestjs.com/techniques/configuration#using-the-configservice- Khaibáoconfigserviceởconstructor(dùngdependencyinjection)

constructor(privateconfigService:ConfigService){}- Lấygiátrịcủa.env,theocúpháp:

40

Trang 42

Ngoài khả năng có thể tạo server theo mô hình MVC, Nest.JS cũng có thể làm serverRestful APIs Chúng ta sẽ cùng nhau viết nhanh module Users theo đúng chuẩn Restful,sử dụng các công cụ có sẵn của Nest.JS, bao gồm generate resources, schema,controller và services.

https://www.postman.com/downloads/

Trang 43

about:blank 43/190#21.CreateSchema(Model)

TạoUserModelvớicácthuộctính:- Email

- Password- Name- Address- Phone- Age

42

Trang 44

EmailPasswordNameAddressPhoneAge}

Trang 45

about:blank 45/190#22.2HashUser’sPassword

44

Trang 46

- Transformdata:convertstring=>number,array…- Validatedata

npmi save-exactclass-validator@0.14.0class-transformer@0.5.1yarnaddclass-validator@0.14.0class-transformer@0.5.1Vềclass-validator:https://github.com/typestack/class-validatorVềcustomizemessage?

Trang 47

about:blank 47/190#23.GetUserbyId

46

Trang 48

DELETEhttp://localhost:8000/users/:idBody:Khôngcầntruyền,màtruyềnidởurl

Trang 49

about:blank 49/190Chapter7:StatefulvàStateless

Mọi website đều hoạt động dựa trên mô hình Stateful và Stateless Ở đây, chúng ta cầnnắm vững, hiểu rõ và có khả năng phân biệt điểm khác nhau của 2 mô hình này, bởi vì,việc chúng ta lựa chọn mô hình nào, nó sẽ quyết định cách thức tổ chức code cho dự áncủa chúng ta.

Saukhikéocodevề,chạycáccâulệnhsau:(versionmìnhsửdụnglànode16.x)npmi =>càiđặtthưviện

setup urlMongodb,file.env

-vớistateful:sửdụngroute/login /uservàroute'/'-vớistateless:sửdụngendpoint

+login: /stateless/login =>truyềnbodygồmusernamevàpassword+getusers /stateless/user =>cầntruyềnbearertokenởheaderrequest

48

Trang 50

Mặcđịnh,nestjshỗtrợcâulệnhdebugsđểđặtbreakpoint: start:debug:"neststart debug watch",

]

Trang 51

about:blank 51/1903.Sửdụngdebugs

50

Trang 52

#28.StatefulApplicationWhoyouare? user/guest

2.CácphươngpháplưutrữthôngtincủaclientvàserverClient(browser):localstorage,session,cookiesServer:session(memory/RAM,diskstorage/file,database)

Trang 53

about:blank 53/190#29.Cơchếhoạtđộngcủastatefulapp

52

Trang 54

Vídụ:khibạnthựchiệnchuyểnkhoảnliênngânhàng.từvcb=>mb,sửdụngứngdụngcủavcb.nhưvậy,khibạnchuyểnkhoảntớimb,mbkobiếtbạnlàai,cóhợplệhaykhông

Trang 55

about:blank 55/190#31.Môhìnhstateless

54

Trang 56

khôngcócáchnàođểcóthểdeletetokenđấy.Cónghĩalà,nếutokenđanghợplệ,bạnkhôngthểdeletetokenđấy

Trang 57

about:blank 57/190Chapter8:JWT-JsonWebToken

Sử dụng mô hình Stateless, server sẽ không có “session” để kiểm tra user có hợp lệ haykhông, nên JWT (Json web token) là một giải pháp rất phổ biến được dùng cho mô hìnhnày Ở đây, chúng ta sẽ tìm hiểu về JWT, cũng như áp dụng nó để xác thực người dùngtrong dự án Nest.JS

56

Trang 58

- localStorage:access_token->thuậntiệnviệctruycập/lưutrữtoken.lấydatatừlocalStorage:localStorage.get('item').

client(javascript):khôngthểlấycookies=hàm document.cookie

Trang 59

about:blank 59/190Cookiessẽtựhếthạntheo1thờigiannhấtđịnh(nếusetexpireddate)=>kodùngnó

58

Trang 60

passport-local:xácthựcngườidùngthôngquausername/passwordpassport-jwt:xácthựcngườidùngvớijwt(jsonwebtoken)

Trang 61

about:blank 61/190#36.LocalStrategiesvớiNestJS

- passportlàthưviệngốc=>giúpratạoramiddleware(canthiệpvàreqvàres),vàlưutrữthôngtinngườidùngđăngnhập(req.user)

- @nestjs/passportlàthưviệnviếttheophongcáchcủanestjs,giúpviệccanthiệpvàopassportdễdànghơn

- passport-local:đâylàstrategyhỗtrợviệcđăngnhậpsửdụngusername/passwordSaunày,khicầntạorajwt,chúngtasẽcàithêmstrategy:passport-jwt

60

Trang 62

providers: theprovidersthatwillbeinstantiatedbytheNestinjectorandthatmaybesharedatleastacrossthismodule

Imports: thelistofimportedmodulesthatexporttheproviderswhicharerequiredinthismodule

Chúngtacầnxuấtra(xuấtservices/providers)thìcáiimportởtrênmớicótácdụng

Trang 63

about:blank 63/190#37.NestjsGuard

- req->route->middleware.dữliệukohợplệ,khôngthựcthitiếp->res(thôngbáolỗi)- req->route->middleware.dữliệuhợplệ=>next()->controller->service->resHiểuđơngiản,middleware,nhưtêngọicủanó.giúpbạncanthiệpvàogiữareqvàres:req->middleware->res

62

Trang 64

3.VídụvềviếtvàsửdụngGuardđơngiản

Trang 65

about:blank 65/190#38.LocalGuardvớiPassport

64

Trang 66

https://drive.google.com/file/d/1WZJLJxYYCkMasJOEe80TLCoCb-S0oJBP/view?usp=share_link

Trang 67

about:blank 67/190#41.Enableauthenticationglobally

66

Trang 68

https://github.com/nestjs/nest/issues/964#issuecomment-480834786

Trang 69

about:blank 69/190#43.Fixbugsvàtổngkết

68

Trang 70

LuồngprotectedroutesvớiJWT(cầntruyềnlênJWTởheaderrequest)

Trang 71

about:blank 71/190Chapter9:Tưduyphântíchdatabase

Giới thiệu đề tài dự án thực hành cuối khóa, cũng như tư duy phân tích database, cáchthiết kế table và mối quan hệ giữa các đối tượng trong dự án thực hành.

70

Trang 72

Actors:(ngườisửdụnghệthống)- Ứngviên(employee)- Nhàtuyểndụng:company- admin

đốitượngkhác:- CVcủaứngviên- jobsđăngtuyển- Skillsđểsearch

- role:vaitròcủausertronghệthống(admin,hr )

- permission:quyềnhạnsửdụnghệthống-ámchỉapicủabackend

1nhàtuyểndụngcóthểđăngnhiềujobs1jobchỉthuộc1nhàtuyểndụng1skillscóthểthuộcnhiềujobs1jobscóthểcónhiềuskills

Trang 73

about:blank 73/190Vềphânquyền:

72

Trang 74

status:string //PENDING-REVIEWING-APPROVED-REJECTED

Trang 75

about:blank 75/190history:arrayobject[{status:string,updatedAt:Date,updatedBy:{_id,email}}]

74

Trang 76

-name:string-path:string-method:string-description:string-createdAt:Date-updatedAt:Date-isDeleted:boolean-createdBy:object{_id,email}-updatedBy:object{_id,email}-deleteBy:object{_id,email}

Trang 77

about:blank 77/190Chapter10:MongoosePlugins

Để có thể sử dụng Mongoose (MongoDB) hiệu quả, chúng ta sẽ cùng nhau cài đặt cácplugin hỗ trợ việc Query/Filter kết quả, thực hiện “soft-delete”, tự động tạo “timestamp” vàđặc biệt, khắc phục lỗi CORS với Nest.JS

76

Trang 78

deletedAt:null,isDeleted:false

Trang 79

about:blank 79/190#49.QueryBuilder

78

Trang 80

Lưuý:checkoutcodetheotừngmodulesđểthựchànhsongsongvớibackend

Trang 81

about:blank 81/190#51.CORSlàgì?

+ domain:tênwebsitesửdụngcookiesnày+ value:giátrịcủacookies

80

Trang 82

Thựctế:dofacebook.comvàhacker.comlà2domainkhácnhau,nênsẽbịchặnCORSdefault:v

Trang 83

about:blank 83/190#52.1LàmsaođểbypassCORS?

- Backenddobạnkiểmsoát,lỗixảyrakhifrontendgọilênbackend=>fixởbackend(cáchlàmnàysẽđượchướngdẫnởvideotiếptheo)

- Backenddobênthứ3làm.

Môhình:frontend=> backend(củabạn)=>backend(củađốitác)Bạncóbiếtrằng,thưviệnaxios,dùngđượccảfrontendlẫnbackend:v

82

Trang 84

"optionsSuccessStatus":204}

Trang 85

about:blank 85/190Chapter11:ModulesCompany

Bài tập thực hành: tạo module “Company” Ngoài việc thực hiện CRUD, chúng ta sẽ tìmhiểu cách phân trang (paginate data), sử dụng Interceptor để xử lý data trước khi trả vềclient, customize message response cũng như “đánh version” cho API

84

Trang 86

Body{name,address,description}Cóvalidatedữliệukhitạomới

Trang 87

about:blank 87/190#55.UpdateUserType(JWT)

86

Trang 88

5.Move/login=>authcontroller

Trang 89

about:blank 89/190#56.PassingReq.user

88

Trang 90

Tạoendpoint:Patch /companies/id(lưuýtruyềntokenJWTởheader)Body{

Cóvalidatedữliệu,vàđồngthờicậpnhậttrườngupdatedBy.

Trang 91

about:blank 91/190#58.BàiTậpDeleteCompany

Yêucầu:Tạoendpoint:Delete /companies/id

90

Trang 92

pages:totalPages, //tổngsốtrangvớiđiềukiệnquerytotal:totalItems//tổngsốphầntử(sốbảnghi)},

-Counttổngbảnghivớiđiềukiệnfilter-tínhoffset

Trang 93

about:blank 93/190@Query/skip/limit

92

Trang 94

Observable> <Promise

Trang 95

about:blank 95/190#61.1TransformResponse

94

Trang 97

about:blank 97/190

Trang 99

about:blank 99/190

Trang 101

about:blank 101/190

Trang 103

about:blank 103/190

Trang 105

about:blank 105/190

Trang 107

about:blank 107/190

Trang 109

about:blank 109/190

Trang 111

about:blank 111/190

Trang 113

about:blank 113/190

Trang 115

about:blank 115/190

Trang 117

about:blank 117/190

Trang 119

about:blank 119/190

Trang 121

about:blank 121/190

Trang 123

about:blank 123/190

Trang 125

about:blank 125/190

Trang 127

about:blank 127/190

Trang 129

about:blank 129/190

Trang 131

about:blank 131/190

Trang 133

about:blank 133/190

Trang 135

about:blank 135/190

Trang 137

about:blank 137/190

Trang 139

about:blank 139/190

Trang 141

about:blank 141/190

Trang 143

about:blank 143/190

Trang 145

about:blank 145/190

Trang 147

about:blank 147/190

Trang 149

about:blank 149/190

Trang 151

about:blank 151/190

Trang 153

about:blank 153/190

Trang 155

about:blank 155/190

Trang 157

about:blank 157/190

Trang 159

about:blank 159/190

Trang 161

about:blank 161/190

Trang 163

about:blank 163/190

Trang 165

about:blank 165/190

Trang 167

about:blank 167/190

Trang 169

about:blank 169/190

Trang 171

about:blank 171/190

Trang 173

about:blank 173/190

Trang 175

about:blank 175/190

Trang 177

about:blank 177/190

Trang 178

npmi save@nestjs/throttler@4.1.0

Trang 179

about:blank 179/190#109.Swagger

{type 'http': ,scheme 'Bearer': ,bearerFormat 'JWT': ,in 'header': ,},'token',)

178

Trang 180

-Chưaautoaddtocontroller-ChưahandletypeMongoID

Trang 181

about:blank 181/190Codethamkhảophầncấuhìnhswagger:

180

Trang 182

3.Devopsprometheusvsgrafana

Trang 183

about:blank 183/190#111.DocsWholeAppBackend

182

Trang 184

};}

Trang 185

about:blank 185/190#113.UpgradeNestJSVersion

Câulệnh:ncu-usẽlàmthayđổipackage.json=>cầnchạycâulệnhnpmi đểcàiđặt

184

Trang 186

npmERR! @nestjs/core@"10.0.3"fromtherootprojectnpmERR! node_modules/@nestjs-modules/mailer

npmERR! @nestjs-modules/mailer@"1.8.1"fromtherootprojectnpmERR! 7more(@nestjs/mongoose,@nestjs/platform-express, )npmERR!

npmERR! peerOptional@nestjs/platform-express@"^10.0.0"from@nestjs/core@10.0.3

npmERR! node_modules/@nestjs/core

npmERR! @nestjs/core@"10.0.3"fromtherootprojectnpmERR!

=>sửdụng legacy-peer-depsnpmi legacy-peer-deps

Trang 187

about:blank 187/190=====

npmi-g@nestjs/cli@10.0.3 =>trùngversionvớidevDependenciesKiểmtraversioncàiđặtglobal:npmlist-g

186

Trang 188

https://drive.google.com/file/d/1fwc_a4HhDgtq-HfSUBI6821bCoKArlIm/view?usp=sharing

Trang 189

about:blank 189/190#115.NhậnXétVềKhóaHọc

188

Trang 190

Hẹngặplạicácbạnởcáckhóahọctiếptheo….HỏiDânIT(Eric)

Ngày đăng: 06/05/2024, 11:55

Tài liệu cùng người dùng

Tài liệu liên quan