Đang tải... (xem toàn văn)
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 1about:blank 1/190TÀILIỆUKHÓAHỌC“Nest.JSvớiTypeScript/MongoDBSiêuDễ”
- Thêmtómtắtchocácchươngtàiliệu.
Trang 6Giớ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 7about: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 8Vớ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 9about: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 10Youtube“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 11about: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 12Nest.jssẽcungcấpbộkhungframework(architecture-kiếntrúc),việccủachúngtalàsửdụngbộkhungđấyđểbuildsảnphẩmmìnhmuốn.
Trang 13about: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 15about: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 17about: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 19about:blank 19/190#6.SửdụngDecoratorvớiNest.JS
18
Trang 20classExampleClass{@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 21about:blank 21/190#7.MôhìnhRoutervớiNest.JS
20
Trang 22}
Trang 23about: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 25about: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 27about:blank 27/190publicclassB{
26
Trang 28Minhhọ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 29about:blank 29/190Ứngdụngtrongthựctế:
28
Trang 30còn1thànhphần,gọilàinjector(giúptạoraDI,vàlàmchoclassAvàBkhôngphụthuộcvàonhau:v)
Trang 31about:blank 31/1902.Vídụvềphạmvi(scope)vàcáchsửdụngDI
30
Trang 32}
Trang 33about: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 35about:blank 35/190#15.VấnĐềtồnđọngvớiSSR?
34
Trang 37about: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 38CàiđặtMongoDBServerhoặctạotàikhoảnvàsửdụngdatabaseAtlasonline
Trang 39about: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 41about: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 42Ngoà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 43about:blank 43/190#21.CreateSchema(Model)
TạoUserModelvớicácthuộctính:- Email
- Password- Name- Address- Phone- Age
42
Trang 44EmailPasswordNameAddressPhoneAge}
Trang 45about: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 47about:blank 47/190#23.GetUserbyId
46
Trang 48DELETEhttp://localhost:8000/users/:idBody:Khôngcầntruyền,màtruyềnidởurl
Trang 49about: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 50Mặcđịnh,nestjshỗtrợcâulệnhdebugsđểđặtbreakpoint: start:debug:"neststart debug watch",
]
Trang 51about: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 53about:blank 53/190#29.Cơchếhoạtđộngcủastatefulapp
52
Trang 54Ví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 55about:blank 55/190#31.Môhìnhstateless
54
Trang 56khôngcócáchnàođểcóthểdeletetokenđấy.Cónghĩalà,nếutokenđanghợplệ,bạnkhôngthểdeletetokenđấy
Trang 57about: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 59about:blank 59/190Cookiessẽtựhếthạntheo1thờigiannhấtđịnh(nếusetexpireddate)=>kodùngnó
58
Trang 60passport-local:xácthựcngườidùngthôngquausername/passwordpassport-jwt:xácthựcngườidùngvớijwt(jsonwebtoken)
Trang 61about: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 62providers: theprovidersthatwillbeinstantiatedbytheNestinjectorandthatmaybesharedatleastacrossthismodule
Imports: thelistofimportedmodulesthatexporttheproviderswhicharerequiredinthismodule
Chúngtacầnxuấtra(xuấtservices/providers)thìcáiimportởtrênmớicótácdụng
Trang 63about: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 643.VídụvềviếtvàsửdụngGuardđơngiản
Trang 65about:blank 65/190#38.LocalGuardvớiPassport
64
Trang 66https://drive.google.com/file/d/1WZJLJxYYCkMasJOEe80TLCoCb-S0oJBP/view?usp=share_link
Trang 67about:blank 67/190#41.Enableauthenticationglobally
66
Trang 68https://github.com/nestjs/nest/issues/964#issuecomment-480834786
Trang 69about:blank 69/190#43.Fixbugsvàtổngkết
68
Trang 70LuồngprotectedroutesvớiJWT(cầntruyềnlênJWTởheaderrequest)
Trang 71about: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 72Actors:(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 73about:blank 73/190Vềphânquyền:
72
Trang 74status:string //PENDING-REVIEWING-APPROVED-REJECTED
Trang 75about: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 77about: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 78deletedAt:null,isDeleted:false
Trang 79about:blank 79/190#49.QueryBuilder
78
Trang 80Lưuý:checkoutcodetheotừngmodulesđểthựchànhsongsongvớibackend
Trang 81about:blank 81/190#51.CORSlàgì?
+ domain:tênwebsitesửdụngcookiesnày+ value:giátrịcủacookies
80
Trang 82Thựctế:dofacebook.comvàhacker.comlà2domainkhácnhau,nênsẽbịchặnCORSdefault:v
Trang 83about: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 85about: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 86Body{name,address,description}Cóvalidatedữliệukhitạomới
Trang 87about:blank 87/190#55.UpdateUserType(JWT)
86
Trang 885.Move/login=>authcontroller
Trang 89about:blank 89/190#56.PassingReq.user
88
Trang 90Tạoendpoint:Patch /companies/id(lưuýtruyềntokenJWTởheader)Body{
Cóvalidatedữliệu,vàđồngthờicậpnhậttrườngupdatedBy.
Trang 91about:blank 91/190#58.BàiTậpDeleteCompany
Yêucầu:Tạoendpoint:Delete /companies/id
90
Trang 92pages: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 93about:blank 93/190@Query/skip/limit
92
Trang 94Observable> <Promise
Trang 95about:blank 95/190#61.1TransformResponse
94
Trang 97about:blank 97/190
Trang 99about:blank 99/190
Trang 101about:blank 101/190
Trang 103about:blank 103/190
Trang 105about:blank 105/190
Trang 107about:blank 107/190
Trang 109about:blank 109/190
Trang 111about:blank 111/190
Trang 113about:blank 113/190
Trang 115about:blank 115/190
Trang 117about:blank 117/190
Trang 119about:blank 119/190
Trang 121about:blank 121/190
Trang 123about:blank 123/190
Trang 125about:blank 125/190
Trang 127about:blank 127/190
Trang 129about:blank 129/190
Trang 131about:blank 131/190
Trang 133about:blank 133/190
Trang 135about:blank 135/190
Trang 137about:blank 137/190
Trang 139about:blank 139/190
Trang 141about:blank 141/190
Trang 143about:blank 143/190
Trang 145about:blank 145/190
Trang 147about:blank 147/190
Trang 149about:blank 149/190
Trang 151about:blank 151/190
Trang 153about:blank 153/190
Trang 155about:blank 155/190
Trang 157about:blank 157/190
Trang 159about:blank 159/190
Trang 161about:blank 161/190
Trang 163about:blank 163/190
Trang 165about:blank 165/190
Trang 167about:blank 167/190
Trang 169about:blank 169/190
Trang 171about:blank 171/190
Trang 173about:blank 173/190
Trang 175about:blank 175/190
Trang 177about:blank 177/190
Trang 178npmi save@nestjs/throttler@4.1.0
Trang 179about:blank 179/190#109.Swagger
{type 'http': ,scheme 'Bearer': ,bearerFormat 'JWT': ,in 'header': ,},'token',)
178
Trang 180-Chưaautoaddtocontroller-ChưahandletypeMongoID
Trang 181about:blank 181/190Codethamkhảophầncấuhìnhswagger:
180
Trang 1823.Devopsprometheusvsgrafana
Trang 183about:blank 183/190#111.DocsWholeAppBackend
182
Trang 184};}
Trang 185about:blank 185/190#113.UpgradeNestJSVersion
Câulệnh:ncu-usẽlàmthayđổipackage.json=>cầnchạycâulệnhnpmi đểcàiđặt
184
Trang 186npmERR! @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 187about:blank 187/190=====
npmi-g@nestjs/cli@10.0.3 =>trùngversionvớidevDependenciesKiểmtraversioncàiđặtglobal:npmlist-g
186
Trang 188https://drive.google.com/file/d/1fwc_a4HhDgtq-HfSUBI6821bCoKArlIm/view?usp=sharing
Trang 189about:blank 189/190#115.NhậnXétVềKhóaHọc
188
Trang 190Hẹngặplạicácbạnởcáckhóahọctiếptheo….HỏiDânIT(Eric)