Learn The MERN Stack - Express & MongoDB Rest API

Поделиться
HTML-код
  • Опубликовано: 30 сен 2024

Комментарии • 540

  • @TraversyMedia
    @TraversyMedia  2 года назад +231

    As far as the schedule for this series, the second video will be uploaded soon. Probably a couple days. The 3rd and 4th frontend videos will be within 1 - 2 weeks.

  • @salimsuleiman7984
    @salimsuleiman7984 2 года назад +451

    Brad never disappoints, he must be protected at all costs

    • @charlesowusu3958
      @charlesowusu3958 2 года назад +16

      People from Africa will understand this better ❤️

    • @kaypakaipa8559
      @kaypakaipa8559 2 года назад +19

      This guy taught me everything lol.
      I literally have a job at a major company as fullstack dev bcoz of his videos.

    • @wasimraja2980
      @wasimraja2980 2 года назад +1

      Protect from whom ?

    • @sanjaybatak3549
      @sanjaybatak3549 2 года назад +1

      Mans always protected.

    • @jhatpatchutpk
      @jhatpatchutpk 2 года назад

      Your comment is hilarious 😂

  • @yashodhadhanushka1415
    @yashodhadhanushka1415 Год назад +66

    At around 55:58 if anyone has a problem with 'await goal.remove()' you can replace 'await goal.remove()' with 'await goal.deleteOne()'
    *The remove method is deprecated in Mongoose 6 and has been replaced with deleteOne or deleteMany methods*

    • @schoolWork200
      @schoolWork200 Год назад

      I think we can also do await Goal.findByIdAndDelete(req.params.id);

    • @budysutjijati
      @budysutjijati 11 месяцев назад

      Hi @yashodhadhanushka1415, .findByIdAndRemove() seems better.

    • @NdubuishiUlenu
      @NdubuishiUlenu 11 месяцев назад

      I encountered this problem and it took me nearly an hour to figure it on my own using chatGPT, I should have just found my way to the comments😫😥

    • @jaywinebrenner
      @jaywinebrenner 7 месяцев назад +1

      Thank you for this!

    • @awakenwithoutcoffee
      @awakenwithoutcoffee 6 месяцев назад

      fistbump.

  • @UrCloud2
    @UrCloud2 2 года назад +52

    Dear brad, thanks for making this video. I’d like to tell the viewers that the remove() method from mongoose is depreciated and it’s recommended to use the deleteOne() method that takes an id as object

    • @riyadulislam2220
      @riyadulislam2220 2 года назад +1

      still wokring remove() method too . however, Thanks a billion for your comment

    • @jhatpatchutpk
      @jhatpatchutpk 2 года назад +3

      Such updates make you want to pull at your hair

    • @jerryrodriguez6151
      @jerryrodriguez6151 Год назад

      I ran into this issue and searched the comments to see if anyone else had the same issue. You're a legend! Thanks so much!! This resolved it for me.

    • @tomislavbusic2652
      @tomislavbusic2652 Год назад

      Thanks!!😁

    • @ephphatha230
      @ephphatha230 Год назад

      life saver 🥰

  • @thinkverse2672
    @thinkverse2672 Год назад +7

    56:00 remove() method is now deprecated, you can now use deleteOne() method along with the id of the goal

  • @hamzahmd_
    @hamzahmd_ 2 года назад +53

    Brad, I got web development expertise because of your tutorials/Udemy courses and that has enabled me to work on real-world projects. Thank you so much, Brad. I love the style of your teaching. You really are an asset to this dev community.

  • @mma-dost
    @mma-dost Год назад +2

    Can anyone explain why we are making node modules in the root folder ? What if we have to deploy frontend and backend separately. Please help anyone ? :(

  • @archimedesrocha
    @archimedesrocha 2 года назад +42

    Brad thank you for share a excellent serie for backend devs.
    I'm still learning frontend but I already see the need to integrate database to my projects more and your videos will definitly help a lot.

    • @TraversyMedia
      @TraversyMedia  2 года назад +11

      No problem at all. I hope this series helps :)

  • @dileep_hegde
    @dileep_hegde 2 года назад +17

    Hey Brad, It would be great if you configure typescript for the backend or use modern JavaScript (module) for this project. Import/export and so on

  • @mykalimba
    @mykalimba 2 года назад +48

    34:05 Pro Tip: If you don't want the returned JSON to even show a "stack" property in production mode, set the property value to "undefined" in the error handler (instead of "null", line 8 at 32:30).

    • @hafizadeel493
      @hafizadeel493 2 года назад

      Helpful Thanks

    • @pmaruf42
      @pmaruf42 2 года назад +1

      Hi, I tried a lot but I don't know why my error overwriting was not working. It was showing the same html error. Can you help me?

    • @-ygdrayko2029
      @-ygdrayko2029 2 года назад +5

      @@pmaruf42 i had the same problem you need to put the app.use(errorHandler) under the route of /api/goals

    • @pmaruf42
      @pmaruf42 2 года назад +1

      @@-ygdrayko2029 Tried that. But yet not working

    • @mayor3367
      @mayor3367 2 года назад

      @@pmaruf42 Were you able to solve your problem?

  • @Dexilic
    @Dexilic Год назад +15

    At around 56:02 just so anyone who's having a problem with goal.remove, it's been deprecated and you can now use goal.deleteOne() instead. Hope that helps!

  • @EliasJovancicPersson
    @EliasJovancicPersson Год назад +6

    amazing tutorial, finally i am able to understand express and mongo. Thanks!

  • @daedrikaskhan
    @daedrikaskhan 2 года назад +2

    Traversy Media is the only youtube channel brand I could wear without shame.

  • @MarsTheProgrammer
    @MarsTheProgrammer 2 года назад +3

    If you are on a mac and for some reason port 5000 is already being used it may be AirPlay using the port (via the new update). Do the following command "lsof -i :5000" and if you see something like CommandCE then it is being used by AirPlay. Start using port 5001 instead.

    • @RameshKumar-mv3jd
      @RameshKumar-mv3jd 2 года назад

      Or if you don't use AirPlay you can go to "System Preferences > Sharing" and disable "AirPlay Receiver".

  • @ankanchanda8272
    @ankanchanda8272 Год назад +1

    Hi. I am getting this error, " MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string."
    As soon as I am calling connectDB(), the above error is coming.

  • @SERBIANUGANDANKNUCKLES
    @SERBIANUGANDANKNUCKLES 2 года назад +1

    20:02
    i got this error
    Cannot GET /api/goals
    in Postman
    PLEASE HELP! thanks

  • @manasal1487
    @manasal1487 2 года назад +3

    Hello Brad your tutorials are so good and I am learning so much from it. 46:08 at this point I am facing error
    [nodemon] starting`node backend/server.js`
    What to do?

    • @dmitryutkin9864
      @dmitryutkin9864 2 года назад

      I got 'undefined' for process.env.MONGO_URI ((

    • @dmitryutkin9864
      @dmitryutkin9864 2 года назад +2

      the reason was I put .env not in the root projec folder

    • @manasal1487
      @manasal1487 2 года назад +1

      @@dmitryutkin9864 but I have put all the files in order just as Brad had explained, but still I don't know what's wrong.
      The error occurs when I add these lines in server.js:
      const connectDB = require (./config/db) and connectDB()

  • @syntaxed4365
    @syntaxed4365 2 года назад +3

    Great stuff as usual, Brad! Apologies, I smashed the like button a bunch of times, but alas it only counted one. You're an absolute beast! Keep it up, man!

  • @nseals100
    @nseals100 2 года назад +1

    For the people having trouble with their middle ware receiving 404's
    const bodyParser = require('body-parser');
    app.use(bodyParser.json());
    const myRoutes = require('./routes/routes')
    //middleware
    app.use('/user', myRoutes)

  • @ninjacat959
    @ninjacat959 2 года назад +3

    55:26 I actually did it by myself so I feel like I'm learning that was a good part to add in.

  • @lingling5128
    @lingling5128 2 года назад +1

    33:56 if the .env is not recognized just add a path to .config for example require('dotenv').config({ path: '../.env' })

  • @jlambert12013
    @jlambert12013 2 года назад +3

    Literally woke up this morning and thought, I’m going to do a MERN stack application today, went to RUclips and saw this! Thanks, Brad!

  • @tresthegoat
    @tresthegoat 2 года назад +2

    If you have issues with "text" not being defined around the 28:00 mark, make sure you're middle ware is above your route setup.

  • @siddharthshinde8363
    @siddharthshinde8363 Год назад +1

    @56:06 replace remove() with deleteone(), as it is deprecated.

  • @LtdJorge
    @LtdJorge 2 года назад +2

    I would looove a NestJS real-life example tutorial after Express. I'm finding it difficult to understand with all the patterns and advanced TypeScript.

  • @jayasimhareddy8114
    @jayasimhareddy8114 2 года назад +1

    Can you please create frontend with React-Typescript and redux_toolkit?

  • @yourmentorthommy9559
    @yourmentorthommy9559 Год назад +3

    Hi Brad,
    Thanks for the great tutorial! One of the best I have found on the internet!
    One quick question about the folder structure.
    Is there any reason why the .gitignore, package.json and all backend dependencies are installed in the project root instead of inside the backend folder?
    Wouldn't it be better to keep the backend and frontend folder structure completely separate?
    I apologize if this is a very simple question. I am just trying to learn best practices for keeping the folder structure well organized in a full-stack application.

    • @zyphr69
      @zyphr69 10 месяцев назад

      Well we do this just because when we are developing a full stack we have to not only work with the server but also the client side positioning our dependencies in the root will allow us to not only serve the server but also the client at once when i production

  • @dilucsuki8470
    @dilucsuki8470 2 года назад +2

    7:21 to avoid having to acept everything after `npm init` you add the -y flag. `npm init -y`

  • @ramibasheer7002
    @ramibasheer7002 Год назад +1

    i've watched alot of vids about MERN Stack, and this one is by far the best one!!
    thank u so much!!

  • @tigana
    @tigana Год назад +1

    Thank you this tutorial really cleared some things up for me. The part where you explained why we use the .env file + when you grabbed the connection string from atlas were lightbulb moments

  • @aluuusch
    @aluuusch 2 года назад +1

    Nope, from 22:00 on its no more working for me on Postman.
    I did the exact same thing, but it would give me a "Could not send request" .

    • @Unknown-ek9gl
      @Unknown-ek9gl 2 года назад

      Hello, pay attention on package.json, you need to have same versions as author, "dotenv": "^15.0.0", "express": "^4.17.2", "mongoose": "^6.1.9".
      npm i express@4.17.2 dotenv@15.0.0 mongoose@6.1.9 colors

  • @basketo3Dgame
    @basketo3Dgame 7 месяцев назад +1

    why is update not updating

  • @mikeynavarro3195
    @mikeynavarro3195 Год назад +1

    man i just graduated from a coding bootcamp and they are teaching your videos verbatim smh. I should have just subscribed to you and cut out the middle man

  • @الجزائري-ض1ج
    @الجزائري-ض1ج 2 года назад +1

    May you add JWT auth to this MERN serie?

  • @vuongqtvn
    @vuongqtvn 2 года назад +1

    Brad is my idol, Thanks

  • @koushithb.r3984
    @koushithb.r3984 2 года назад +1

    findByIdAndDelete() and findByIdAndRemove() are doing the same?

    • @priyankaroberts1093
      @priyankaroberts1093 2 года назад

      Hey Koushith ! Do you usually learn through these online tutorials? Would you be interested in exploring internship/job opportunities in web development?

  • @Well2388
    @Well2388 День назад

    After Mongoose v6,remove() function is abandoned, should use deleteOne() or deleteMany()

  • @bohdankhv
    @bohdankhv 2 года назад +3

    That's just what I'm learning. Focus on mern this year. Thanks so much Brad, I've been following you for 4 years now!

  • @tomdevisser2062
    @tomdevisser2062 2 года назад +6

    55:59 remove() is deprecated, you should use deleteOne() or deleteMany() instead.

  • @vishalkaushik9133
    @vishalkaushik9133 2 года назад +1

    your content is excellent on youtube very good quality and professional work kudos

  • @pliniojr95
    @pliniojr95 Год назад +1

    I've seen a lot of videos about mern, but eventually i would get lost watching them. Your video was the first that kept me on track, especially about the mongo and mongoose part. Thank you, looking forward to see the next videos.

  • @pranansubba9587
    @pranansubba9587 2 года назад +1

    In one interview I mentioned your name, when he asked me why I ended up in xyz framework. I told him because I found Brad video on RUclips and then I started to learn. Now I'm doing Job. Thanks Brad.

  • @renujadecosta6408
    @renujadecosta6408 2 года назад +15

    Learned the MERN stack from you from your E COMMERCE COURSE on Udemy..and now I work as a MERN stack developer full time... That course of Brad really takes from ZERO to HERO of MERN STACK.. Thanks a lot BRAD for that course

    • @huseyinkara123
      @huseyinkara123 2 года назад

      Hi, which course you learned?

    • @yehannk448
      @yehannk448 2 года назад

      which course please

    • @renujadecosta6408
      @renujadecosta6408 2 года назад

      @@huseyinkara123 MERN stack E COMMERCE course on Udemy..

    • @renujadecosta6408
      @renujadecosta6408 2 года назад

      @@yehannk448 E commerce MERN stack course on Brad's udemy ... Tbh ..that course literally changed my life..Man I feel like I should give like $100 for that course..

    • @TR1ckY_TV
      @TR1ckY_TV 2 года назад

      @renuja de costa
      Can't u provide the link?!!

  • @bellion166
    @bellion166 Год назад +2

    If your errorHandler doesn't fire, try placing the `app.use(errorHandler)` stmt after routes:
    ...
    app.use('/api/items', require('./routes/itemRoutes'))
    ...
    app.use(errorHandler);
    ...

  • @andrewbartson482
    @andrewbartson482 Год назад +3

    Brad, it's really helpful how you explain things as if I'm sitting next to you, giving a few tangential comments that give the context. After you write the code and describe what it does, I can finally wrap my mind around stuff that previously was confusing. For example, from your explanation of error handling plus some studying on my own, I discovered it's not that complicated, and I'm one step farther on the path to excellence.

  • @BoolFalse
    @BoolFalse 2 года назад

    Getting this error at the 3rd, 4th part of this tutorial, couldn't solve it yet.. what's the exact reason and is there some solution for this ?? Thanks:
    [1] (node:12193) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
    [1] (Use `node --trace-deprecation ...` to show where the warning was created)
    [1] (node:12193) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.

  • @nabinsaud4688
    @nabinsaud4688 2 года назад +2

    You never compromise your student audience interest you know what we need ❤

  • @L8947
    @L8947 2 года назад +1

    Careful about naming your database with upper case letters or naming it the same as your project name. I received a db error that stated the following: "db already exists with different case already have"
    From doing some research I gathered that names in MongoDB are not case sensitive and can basically conflict with each other somehow. I didn't dive too deep into it but after renaming my database from MERNGoalApp to goalapp it worked just fine. If anyone has some knowledge on this to share that'd be better than pouring through docs.

    • @twogymfreaks6628
      @twogymfreaks6628 Год назад

      I can't connect with db on console its just showing the error which i wrote in catch block any suggestion

  • @IbnShaalan
    @IbnShaalan 2 года назад +1

    54:31
    new: true
    means return the new updated values
    if u set it to false the doc will update and the response will not

  • @SUNYBOI
    @SUNYBOI 2 года назад +1

    You teach like Indians, they also explain everything and you also explain everything and makes these technologies much much easier. I know by the end of this course I will have a strong MERN foundation. ❤️

  • @mounirkanane8083
    @mounirkanane8083 Год назад

    At 54:14, why do we findByIdAndUpdate when we already called findById before? What was the point of the first findById call? Thank you for reducing my ignorance.

  • @kavindajayaweera6146
    @kavindajayaweera6146 14 дней назад

    Thank you Brad..Superb stuff...Keep up the good work

  • @abdullahihussein2393
    @abdullahihussein2393 2 года назад +1

    Thanks so much Brad. Just a quick question whats the vscode theme you are using?

    • @Dcooper676
      @Dcooper676 2 года назад

      Material theme or atoms one dark

  • @kalyanboro6338
    @kalyanboro6338 2 года назад +2

    I have been learning from you since 2016. Your are one of the best teachers on youtube. Thank you for your selfless service sir!!

  • @danavzaradel
    @danavzaradel 2 года назад +1

    I understand 99.9% of what you do, but as a jr developer if I try it myself I can't even remember the first lines after requiring express. 1 Is this normal? 2. what should I do to really be able to do this by myself?

    • @BlackDev
      @BlackDev 2 года назад

      reverse engineer it

  • @imadfaisal161
    @imadfaisal161 9 месяцев назад

    Can anybody link me to the old course with Support Ticket Application please.

  • @khalidelgazzar
    @khalidelgazzar Год назад

    56:00 Just one correction as remove() will not work ...
    // use deleteOne() instead of remove()
    await goal.deleteOne()

  • @Opacity5
    @Opacity5 2 года назад +2

    I have already completed two of his mern course from udemy. i am watching these as a refresher in free time. thanks brad as always!

  • @shawngardiner2604
    @shawngardiner2604 2 года назад +3

    Hey Brad, I can't even begin to tell you how much you have taught me through your channel and Udemy courses I have bought, Just finished the back end two videos as a refresher, and the way you laid this out with the Models and Controllers part of the MVC pattern is just first rate. Also the fact that this can be used for all frontend libraries. I'm working on integrating with PHP, SQL, and Firebase just to see the layout. But again great work as usual.

  • @HaifengZhu-pn3uq
    @HaifengZhu-pn3uq 5 месяцев назад

    Hi, is MERN good for quick development?

  • @Will-xl7xp
    @Will-xl7xp 2 года назад

    My get request is taking forever to send... @49 min of the view could anyone help[

  • @nnasim5089
    @nnasim5089 2 года назад

    i am having trouble with goals.find() it says its not find , still i have to pass a query or some parameter, or other wise goals.json is working , and returning empty object at this point #51:36

  • @AbdullahKhan-jo6db
    @AbdullahKhan-jo6db Год назад

    Will you complete mern stack tutorials from beginner to advanced?

  • @Mrdorsett333
    @Mrdorsett333 2 года назад

    When I start my server it is still on port 5000 instead of 8000 when I have 8000 in my .env. Im not sure why. The code looks correct.

  • @thedevnoteyt
    @thedevnoteyt 2 года назад +2

    Can you please tell me the name of the vscode theme you're using ?

    • @TraversyMedia
      @TraversyMedia  2 года назад +3

      Sure, it is GitHub Dark. There are a few choices like dimmed, etc. It is just the regular dark.

    • @thedevnoteyt
      @thedevnoteyt 2 года назад

      @@TraversyMedia thank you so much 😀❤️

    • @tamasbeszedics
      @tamasbeszedics 2 года назад

      @@TraversyMedia and could u please tell me which font are you using?

  • @burntoearn6181
    @burntoearn6181 2 года назад

    Hye brad. Hope you having a good day.
    I need a favor please can you tell me which video series i should i watch for using node.js APIs as back-end with react.js front-end.
    THANK YOU.

  • @ColombusLeBus
    @ColombusLeBus 2 года назад

    I had an error connecting to the DB an I was looking for answers everywhere till I saw I had installed moongoose and not mongoose (with a single "o") fml -.-

  • @shivyanshgarg2641
    @shivyanshgarg2641 3 месяца назад

    Can anyone tell me the prerequisites before watching this video

  • @catrybou123
    @catrybou123 11 месяцев назад

    How do you get intellisense for the functions of the Goal model? They don't show up for me.

  • @androidincredible
    @androidincredible 2 года назад +1

    Was thinking about learning mern stack and got the notification on the right time. Thanks ❤️

  • @mahinsameen7251
    @mahinsameen7251 11 месяцев назад

    mine says "Mongodb connected: undefined" instead of showing the connection string in the console. is that normal?

  • @dcmbassi
    @dcmbassi 2 года назад

    Anybody know how to reset the free cluster user password on Atlas? I'm embarrassed to say I can't remember mine.

  • @hoangtruong2239
    @hoangtruong2239 Год назад

    how do I get all the autocomplete for mongoose if I'm using typescript, or should I do that in the first place?

  • @andreaso.1549
    @andreaso.1549 2 года назад

    at 30:00 my app crashes when I throw new Error, instead of returning 400 with the error message. Any ideas why?

  • @royelbert7353
    @royelbert7353 6 месяцев назад

    my content-type on postman wont change to json after I change res.json in my vsc app. anyone have any idea how to do it?

  • @AlphaFrog1021
    @AlphaFrog1021 2 года назад

    at 45:40 vscode underlines await because it has no effect on this type of expression doesn't mongoose.connect return promise?

  • @rj_nelson_97
    @rj_nelson_97 2 года назад +2

    Extremely valuable tutorial from start to finish. I've been looking for an updated tutorial on the MERN stack. Thank you for providing. I'm looking forward to the next one.

  • @marufmarzuq
    @marufmarzuq 2 года назад +2

    Thank you Brad for starting this full stack series. ❤️

  • @rayaqin
    @rayaqin 2 года назад

    the lack of semicolons hurts my eyes
    great video though, thanks man

  • @oliverzhang6102
    @oliverzhang6102 2 года назад +1

    Hi Brad, it would be worth noting about the issue with Colors, where the developer sabotaged the project and made a mess for everyone using the latest version.

    • @maruko8324
      @maruko8324 2 года назад

      Oh well I'm not the only one facing this issue. I thought I did something or missed something that caused the error.

  • @FiveFourThor
    @FiveFourThor 2 года назад

    YOU'RE THE LEBRON JAMES OF CODING TUTORIALS

  • @Anonymous-xy8ps
    @Anonymous-xy8ps 2 года назад +4

    MEVN stack would really help Vue developers. As always thank you for the amazing content 🔥🔥

  • @lifeform106
    @lifeform106 2 года назад

    Wow that background lighting looks amazing brad! Thanks for the geat content! :D

  • @kisler-fullstac
    @kisler-fullstac Год назад

    Amazing! is very good, thank for you give.

  • @Ankitgupta-gj9us
    @Ankitgupta-gj9us Год назад

    I found an error that module not found while setting my api and npm is not working then what I will do

  • @ismailbakhach8990
    @ismailbakhach8990 10 месяцев назад

    why we don't create the node_modules in the backend folder ?

  • @ittechguy3306
    @ittechguy3306 Год назад

    hey Brad, looking forwar to update your MERN STACK Full course on your UDEMY channel, waiting to apply update redux configureStore. thanks.

  • @taiwoadedayo624
    @taiwoadedayo624 Год назад +1

    It's a wonderful time to thank Brad for the journey so far. Here I am learning Node.Js from the very same man that helped me with HTML, CSS & Js

  • @speedtnt7591
    @speedtnt7591 Год назад

    May you please show us how to connect this API to flutter thank you 🙌

  • @hussamdev6863
    @hussamdev6863 2 года назад +1

    Greetings from Syria

  • @studymaterial988
    @studymaterial988 2 года назад +1

    Thanks Brad for great content 😄♥️♥️

  • @isurudeshan420
    @isurudeshan420 Год назад

    55.39 Note:- remove() function is now deprecated for mongoose v5. 5.3 and above. We use deleteOne(), deleteMany(), etc.

  • @omarnoor5192
    @omarnoor5192 2 года назад

    @Traversy Media HELP! I am confused why we are installing and using express-async-handler, instead of try/catch in the async block

  • @prabhupadswain7638
    @prabhupadswain7638 Год назад

    Hello Brad, Thanks a lot for wonderful video and even more beautiful updated MERN playlist.
    I had a doubt. The goal.remove() function is not working as of today. In the Postman is throwing an error that goal.remove is not a function and and showing TypeError.

  • @ryanmugo4206
    @ryanmugo4206 10 месяцев назад

    Great work....Understood everything you had said!!!! Thank you so much!!

  • @nemeziz_prime
    @nemeziz_prime 2 года назад +3

    Brad's explanations and clarity in teaching are top notch 👌🏻🔥

  • @designsrs
    @designsrs 2 года назад +1

    Worth watching at 3 in the morning ❤️❤️ #bradalwaysrocks

  • @saajid5009
    @saajid5009 2 года назад

    I came online to get a Basic Knowledge about MERN Stack. And i RUclips Recommed Me Traversy's Latest Video.... Wht a Timing.. Thank You Brad. Thank You RUclips

  • @coderamrin
    @coderamrin 2 года назад +1

    as always, very helpful tutorial. thanks for creating these videos Brad

  • @hanifbahari6606
    @hanifbahari6606 2 года назад +1

    Amazing, could not be more understandable and easy to follow. Thanks a lot!