Middleware in nextjs | Nextjs fullstack course

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
all right hey there everyone hitesh here one more time into the next year series so what we were doing in the next year series it's tough to remember just kidding just kidding I exactly know what we were doing in the last video and yes in this video we'll be taking this a step further so we have achieved the goal of signing up the user logging in the user even producing a token and storing that token into the user cookies but right now there are a couple of issues that we want to take down the first one being some of my pages are not protected I want to protect them and obviously the middleware will kick in here the middleware how it works in nexgs is little different so you need to understand that part as well other couple of other use cases as well which I'll discuss in this video and on top of that we want to Simply achieve a route where we can have slash me or something where anybody can get their own information from the database right now we don't have ton of information but whatever the information is we would love to extract that and obviously we need to click up with the log out route as well we haven't worked on that so we'll be working on that as well I think that's enough for this video and we'll see if there is a little bit more to explore or something we'll definitely go ahead and do that as well all right so let's share the screen here so this is what we have been doing now let's run this first and foremost npm run Dev so that we can see what is happening how is it happening and is it all okay so if I just go ahead and refresh this hopefully this is booking Yep this is working let's try to change the number uh with some name yeah bits working but this is nothing is protected I can still go ahead and visit the login page as well so everything is just back and pass and forth let's also see let's also try to log in again let me see the database we have two at the rate gmail.com so let's go ahead and try to log in with that so we'll just go with the two two at the rate gmail.com because I set up the expiry time for one day it's it's not here 24 hours but still I would love to just set it up password very secure one one two three four five six very very secure one let's login it's processing nice and we are redirected to the profile page let's right click inspect is there a shortcut of going directly into the application just let me know if you know in the comment section so I have the token so that is all clear that is that part is still working nicely so let's go back and let's see how we can do that now first thing that I would like to take down is a log out button that how we can actually have a log out so for this I have to create a log out route should be fairly simple obviously we need to First create a backend portion of it then we need to call that logout button or that method or that API route from the front end part of it so let's start with the back end in the apis we have user slash login sign up we'll create another one which is for logout so let's create another folder and obviously without any thought we'll just call it as log out we know this is a back end so we know this is going to be route dot TS there we go now basics of this logout is going to remain same we don't need to create any post requests for that because the way how this is going to do a logout is simply just clear out the token that you have there are a lot of ways how people do it some people actually create a token and save the token expiration time as well refresh token there are a lot of ways I will be going with the basic I want to just clear out the token now in order to clear out the token there is nothing too much to worry about I'll just first bring the next response because that will be doing this and we will be using next response majorly requests no not request okay let's go ahead and do this export obviously this will be a sync a function I'll just use the get request for that get and we don't need any of this here so we anybody can just make a get request just directly that's that's it all right so how we are going to log out first and foremost is go ahead and work on with the try catch the catch part is easy so we'll do that so let's try with the try catch catch and then we'll be saying error that could be any suggestion please no suggestion there we go so and we'll be saying next response we won't be dealing up with the errors suggestions are good but they're not always the best I will be having a Json error response just like that and we are having an extra dot all right so that part is done now only thing that's remaining is create a response which is capable of removing the cookies why this is giving me a problem is it extra yeah this one was extra all right so let's create a response how do we create a response response if I can write that and we simply go ahead and use the next response and with this we want to create a Json remember we are not returning the response yet we are just trying to create a response object so with this I'll hit an enter just like this we'll create a message of logout successful and a success of true also I want to send success of true and that is it now this is my response this response now since it's a response of type next response this can actually interact with my cookies so I can go ahead and say hey response go ahead and interact with cookies there is an S at the end of it and then we can go ahead and use a set and that's it so what we are doing here is a response now this should be a smaller response so token we are setting the cookie token as empty and we are also setting some of the options here which are HTTP true and expire we are just expiring it right now immediately although there is no need of this expiration because just HTTP true will actually do the job but anyways if we are just doing it that's also don't forget to return the response because right now we have done a lot of work but we haven't returned the response and that is it now you are completely capable of logging out the user but the point is how you are going to do this log out because there is right now no place where this logout actually works so you need to find a place where this logout actually works so I'll walk you through that you can just choose any page and can do a log out there the logout that we'll be doing is going to be simply on which page we should be doing it that's a confusing statement I'll be doing it in the profile not into the ID so in case you remember we have this profile and we have this slash ID wherever you wish you can do this I'll actually do this directly into the profile again there is no strong Choice there you can definitely inject a header a navigation bar can put a button there that's not my goal my goal is to get you familiarized and comfortable with next year so a button wherever that is you know now you now know how that is going to work so in this profile page let's go ahead and add a button first we're gonna do is simple in HR so there we go and after this let's go ahead and add a button so we'll just go ahead and say hey Button this button is going to say logout all right and we'll add couple of classes here as well so that button at least looks decent so we'll be having uh I'll happy I'll be happy with the suggestion whatever they provide us all right let's see if that actually works I'll say yeah that's a decent button if I can just add a little bit of the margin on the top margin top four yep I'm happy with this button now this button alone is not going to work definitely we need to set up an on click on that so on click we'll be calling this one as log out this reverse approach is always good because first when you actually click this or declare this method on click automatically the suggestions are improved so that's why I love this all right so let's create a method of this so const log out and we'll be showing like this all right now before we do this obviously we need to make this because right now this is a client not a client component this is a server component so let's go ahead and create this as a client how do we do this a simple uh decorator decorator-ish I will be saying use client there we go now this is a client component what do we need in this we need xeos for that so we'll be saying axios from axios that's the first part we'll be also redirecting the user or probably providing some linking as well so we'll be using this next link there we go and what else I think that is it I think that is it all that we need all right so how do we log out a user really simple just go ahead and simply have a try catch we have done this many times so that should be all easy for you now and for the error part we'll be doing a console log of the error Dot message but I'll also give you an assignment as well we also need to provide an any here and after this we'll be having a message which will be a toast Dot error suggestions please no suggestions and here we can say error.message obviously we haven't brought in the toast so I'll just bring in the toast you decide how the properly how is the proper way to bring it up so toast and that is from react toastify not react justify react hot toast there we go this is obviously not a proper implementation but I'll just leave this as a simple exercise for you now how do we do this make a simple uh get request that's it so we'll be saying axios uh dot get request because that's what we are handling where does this get request go it into slash API slash users slash log out this is where it goes and again this is asynchronous Operation so we need to provide an await as well this logout is also not a synchronous so let's go ahead and add this a sync so that it's happy you can actually trap the response as well in case you wish but I don't think that is required so if you wish you can actually provide better messages with that but I'll go ahead and say toast or successful obviously this is not going to print it anywhere but I also want to push the router somewhere so we haven't used the router because once user is logged out he should be pushed back to login page so we'll be saying import use router from next router okay I'm happy with this and let's go ahead and say I want to create router from use router nice and this router will be capable of pushing to slash login all right so looks okay to me let's try let's test this out and see how many bugs and errors we have got all right so okay next router not mounted all right why the next router is not mounted that's ah my bad because this used router is not from router this is from navigation I told you we actually got this bug many many times let's go all right looks happy now let's go ahead and try ah is there some video recording issue let's see if we have this token uh do we have the token token token token and I don't have a token that's good that's good that means I'm properly logged out so our logout functionality is working that's that's good to know all right so now that our logout functionality is working uh let's go ahead and work on that how the middleware actually works for this we have to actually study a little bit we have to close all of this and this let's study the middleware and here it is this is file not found so I'm going to go ahead and say I want to study middleware thanks for understanding my typos so now it says that middleware allows you to run code before a request is completed so obviously this is exactly what I want to do is before when my request is completed I want to run something the advantage of this my request doesn't reach to the completion phase it actually is being checked intermediately in between so if somebody is not authorized to visit the profile page it will stop it before doing that if somebody is not authorized to visit the login page the user who is already logged in so I can just stop in before visiting that page and I can redirect him to some other page so that's the goal of it so that's a nice one before completing a request and let me Zoom this again then based on incoming request you can modify the response by rewriting redirecting modify the request or response headers sometimes we inject some things in the headers as well for example maybe user ID so some things you want to inject in the response headers or the request header you can do that or you can redirect this modify this however you'll go with that a middleware run before the cached content and routes are matched so this is what they say I use the file middleware.ts now this is a really important word here you have to have to use this as middleware.ts there is no exception in that there is no other file name that you can use it needs to go into I'll show you where it needs to exactly go and how it runs so don't worry on that part although it is mentioned that it goes the same level as Pages app or source so we obviously need to put it inside the source we are talking everything about the source if applicable yes source is applicable for us so we need to put it into the root of source not the root of project remember this okay and now how does the middleware looks this is how it looks in fact instead of talking about it here we can just copy it that would be great and we can simply go up and talk about it so let me go back my code editor here it is again as I told you it is inside the app directory just to show you again Yep this is inside the source so not in the app inside the source all right so we'll just right click on the source create a new file this will be middle middleware dot TS or JS whatever you're using I'm using TS obviously I'll be using the TS you can copy and paste the code which we just copied here just a moments ago and this is exactly how your middleware looks like now there are two parts of the middleware the first portion of it is the logic part and the second part is the matching part that on what route you want to match and you want to run your middleware so you can define a lot of things here so what I'll do is instead of giving it as a string like this you can actually give it an array and it will match all of this that is what I found in the documentation and I found it much more useful so the route that I want to match is Slash and by the way there is also something more interesting in the darks so there is a pattern matching as well so you can match the file patterns as well for example here you can say slash about Slash colon path and whatever the path comes of asterisk means anything you can also match the paths like this like this so this there is a regex that you can involve there's a lot of this so you can see somewhere here let me zoom out so somewhere here they actually mentioned that hey you can match a lot of paths a lot of these details so all of them are mentioned up here I'll just go with the basics that I want to match so I want to match uh this one I also want to match slash profile you can match slash profile slash anything as well that comes up I also want to match if somebody is visiting slash login login and I also want to match slash sign up okay uh these are the paths that I'm worried as of now if I have more I can come back in the middleware and can just simply write the code for that super easy so this part is a matcher I hope that is clear now now let's go back on to this part I'll just remove this comment somehow they're bothering me a little okay so we have this function middleware and right now it's redirecting just the response and we'll just remove everything what is it is returning because we want to write our own logic now what do we want to do now we have couple of paths which are public paths for example login and your sign up these are public paths if somebody has the token he should not be able to access those public paths all right and there are some parts which are protected path so somebody who is not allowed or who is not logged in he should not be seeing profile so something like that so first we need to find out that how we can find out what are the paths because right now we have no access to the paths and luckily for us this next request actually gives us a lot of thing uh next request by the term next request I mean to say this request so this will be helping us in finding on what path you are so you can go ahead and declare a simple path variable just like this and this request has access to this next URL dot path name yep that is that is so simple and no it is not a client side or a client component this is how it always needs to be so once you have this now you can match that what is your path name so we'll be declaring that some of the paths are public and some of the paths are not public so we just need to find out which one are public so const is public but and for the public path what we're going to do is we'll just check if the path is equals to login or the path equals to sign up I think these are the two public paths we are worried about login and sign up so this should not be visible to somebody who has token all right so it's public path again if it is login then it will be true if it is sign up then also it will be true now next thing is we need to extract the token now this is very common we have already seen that while injecting the token that this request is completely capable of going into the user's cookie and we can extract the token from it super simple we can go ahead and say hey request just access the cookies and from that just like we were using set we can actually use the get method of this and we can grab the token now this token might be there might not be there but if it is there so optionally it might be there that's why the optional we can extract the value or we can just provide the empty one so in any case there is a variable known as token which has some value either the actual token value or completely empty that's that's fine okay now I have two variables here and I can decide based on them that whether should somebody should be able to access a path or not so if the path is public and you are having the token that means you should not visit the login you should not be able to visit sign up so let's go ahead and code out that so we're going to go ahead and say if the path is public is public path and you have token then I would love to redirect you now the redirect response is is like that but there are a couple of other ways as well how you can actually provide that this is also good there is no problem in it and you'll also see some of the documentation code that is written somewhat a little bit different in this there you can directly use the redirect there is no problem I haven't found any if you find any let me know in the comment section but you can actually create a new URL that is what I found and new URL no suggestions are not good so I'll just go ahead and say hey this guy needs to redirect somewhere we need to redirect him somewhere because he's trying to access a sign up and login so I don't want that so let's redirect him on to slash that's it and then the second is you have to request use request and then we can say dot next URL so I found this is a little bit tiny better this one needs to be request request come on can't I write request all right so again you can directly use a redirect and can work with that there is no problem with that I found this one a little bit more reliable but again I'll check out documentation as in the next years things are evolving so I'm just also learning as as we go so this is first path we have handled we have rededucted the authenticated users to the slash of the application or in case you want to redirect him to slash profile uh that's your choice totally your choice maybe dashboard whatever it is that's up to you now what if the URL is not public and token is not there so in that case obviously you should log in first so we'll just go with that if there is no public path and there is no token so in that case we'll be just redirecting him to login and then again we'll be using the same format request dot next URL so that it automatically moves to the next URL and it looks like we are having some issues with the curly braces should be happy now yeah the indentation is messed up it shouldn't be like that I think this one can go here and that will do a little bit cleanup yeah I think better all right so now we can see that this is all there and let's see if we can still visit the profile let's save this and let's see how many errors we got uh looks like a good day no errors and let's go back to our application okay let's try to visit profile okay I'm not able to visit profile uh what if I visit profile and Slash hitesh I can still visit it because I haven't mentioned that after the profile am I looking for all the path remember we saw in the documentation we can use Asterix and all those rejects to do so but I'm happy with this this is a simple assignment for you but I cannot visit the profile because that is now protected now let's see the login version of it so I'll just go ahead and say 2 at the rate gmail.com password secure one you know it one two three four five six uh login processing and now we are on the login page can I still visit the login uh no I am redirected to the slash which is home uh but I can actually go ahead and visit the profile as well we should get a profile link here on the home page as well but anyways ah it's fine it's fine we Now understand that how we can extract and write a middleware as well so that's that's a good start now one more thing is notice here that we are able to grab the token as well can we extract some data from the token as well because yes it was us who actually designed this token so we can definitely uh 100 get some uh data from the token as well let's go ahead and try this out let's go ahead and create an API route for it so inside the API users and let's create a new folder what should I call it a user a me user and me yeah whatever the naming convention you want to follow you can go with that I'll probably go with me I think that's okay and then here we'll have a new file so we'll be having route dot TS there we go now how we can grab this information all right now this grabbing the information is going to be done probably multiple times because we will have the token now we know how we can extract the cookies and token and token if you remember if you forgot that let me remind you again at the time of login we actually injected a lot of information in this token I'll just close this one this is the token data so I can technically extract all this information if I know this token secret which I know because I created it so I can actually do this now I can do it directly here as well or I can create a helper method which can help me to extract this token so maybe later on at some point if I want to use it I can call this method so time to go into helpers let's go up here and in the helpers we have this we have no helpers as of now that's so sad we should be having some more helpers so let's create a new file and let's call this one as why it's not writing ah there we go now it's writing so we can say get data from token very liberative dot TS of course okay how we can grab the token data now get token data is super super simple just a few lines of codes I'll do that quickly again this requires the next request otherwise how we will be doing it all right and also we'll be needing JWT JWT suggestions from Json web token now let's go ahead and simply export a function which we'll be calling it as get data from token very liberative I like that and we can have a requests just like this and we'll close this all right how we can get that obviously we'll do a try catch the catch part is super easy super simple we can go ahead and get any and we can say throw not like that throw come on I can write that and throw a new error and we'll be throwing an error message all right that's all we'll be doing now how we can grab this we can simply go ahead and say hey request you can access the cookie you can get the token value just like this or there might be a case where it is empty so we'll just go ahead and use this and we'll store this uh token into a variable or you can call this as encoded token because right now the value is encoded now we need to get a decoded token as well so for that I can use this JWT and this JWT has the option of dot verify not only it verifies the token but it also actually extracted the information as a response of this function so I can just go ahead and say process token and then process.env this is not my variable I have created a sample EnV for you so that we can actually grab this variable from here I'll not open mine one because there's a password in that so I'll just go ahead and paste this make sure you follow this exclamation as well if you are in the typescript now as I told you this actually contains a lot of information so you can call this one as d coded token because it is now having this information and you can extract this information now it's up to you what do you want to return you can return the entire decoded token or you can just extract the ID from it now we have to check that what we actually injected into this one in order to extract this so I need to go into my app API and login route Let's see we injected this ID which is actually user.underscore ID okay so we are happy with this all the keys that you are setting that needs to remain same ID username email so this key is really important so we'll be simply going ahead and getting it like that now this is going to give you a problem because there is no surety that the ID will be here because it doesn't know the data type of it I'll not declare any types here that's not my goal so I'll just inject an any here not a good idea I explicitly say do this in my typescript series but we'll do it here all right so now that this method is available for me which is uh get get data from token now we can actually go back into the me route again I'll just close this login one so that we don't get confused let's import this method and simply work with that so we'll just say get data from token so there we go we got this method here and we'll be needing the request and response because this method is dependent on this request somebody needs to send it there so we'll be saying hey import give me uh not like that yeah give me next request and response from the next server uh we'll also be needing the user user and that user will come up from Models user model I think that's correct let me check that so we are having this models and inside the models user models okay that's correct that's correct and we'll be needing the database connectivity as well so let's go ahead and simply say connect there we go obviously the connection needs to establish so first and foremost let's do this now let's create a simple a method don't go with the suggestion in this case you will explicitly make it go wrong so let's go ahead and say export async I'll accept that and then let's call it as a function this will be a get method a get yeah we are not getting any data so get method is fine and we'll be saying request that request will be type of next request and we can have it like this all right next up obviously our try catch so we'll go ahead with the try catch the catch part is easy so we'll just go ahead and say any here and then we'll be returning a next response no not like that next response dot Json I want to return it Json yeah that's what I like now what do we want to do in the try catch part simple just call this get data from token and pass on a request to it that is it it will give you a returned response we coded it like that return the decoded it gives me a ID so I can just store that into a variable now and obviously this will take some time so let's just go ahead and await that and that is why we created a sync and this will give me a user ID that's my variable so I can call it as user ID underscore ID whatever you like that's totally up to you and then it's time to find a user based on this user ID so user has the superpower to query with the database and I can go ahead and say find by ID or find one whichever you like both of them are gonna serve same in this situation so I'll just use the find one and I'll just give you that hey find based on underscore ID and I'll give you the ID user ID so a space would be nice okay I made it all caps now I just want eye caps not the T I'm happy with this okay so now when this is done uh what more we need to do await because that's a database operation database is another continent and we'll store this as a user so you have given me back a user now this will give you everything I don't want everything because if you check out the database it has ID username email password verified is admin so you can select your fields which one you want and you can deselect the fields which you don't want so I'll just say hey I will go ahead and set select and the password that is what I don't want so you can put a negative sign there by putting a space sadly there is no comma I think the comma would make more sense but sadly there's no comma if you want that I don't want maybe is admin so you can go ahead and put that as well but I'm happy with this one only all right so now I have a user now what can I do with this user I can return a response that hey here's your user now do whatever you like it's an object so I'll just go ahead and say return next response the next response response come on and we'll have a Json just like this and in here we'll be saying a message first and foremost come on message user found and then the data will be sending the data like this so we'll be sending user all right looks good you can send the data directly as well in case you wish that's okay and now we can simply have a save on this one all right so now we have designed a route which can actually help us to Simply go ahead and work with this so it's totally up to you that how you want to utilize it maybe you want to make another request let's do it let's have fun so in this slash profile let's actually grab the user's ID now we know how to do this so as soon as somebody lands here I want to fire an xeos request to me and I want to grab that user let's try that let's try if we can do this and inside the profile will go into page now obviously I want to have this get details method and this get details method uh will run let's just run it on a button click you can run it with the use effect as well as soon as the page loads but I want this one to run it on a method call so we'll go up here we'll design the method so I'll just minimize this log out not interested in that let's call this as get user details like this and obviously this will be a sync just like this now how do we do this pretty simple we need xtos it will fire a get request to slash user slash me ah nice I like that this will await because it's a request and we'll grab a user out of it or a response out of it first not the user now with this we can go ahead and say a console log first and we'll say res dot data all right and since this is a res dot data we actually need a state as well where we can pass on this information without this it's it's not going to be very helpful but again it's up to you I need a I need a state so I'll call this one as data you can call it as user as well I'll call this one as data no I don't need this I don't need this either I'll have a string which says nothing just for fun U state is not available why is it not available it should be here react and we'll be having you state from react okay now once we have this now I can use this set data method to actually use this so set data what is happening no I don't want Mongoose set why unobvious suggestions so we'll be having set data and that data will get res dot data but the problem is the data is not inside the res dot data it's actually inside since we have passed our information like this so let me show you this if we are passing the data so res dot data has all of this data so res dot data dot data dot user will have the information Yeah we actually accidentally made it more messy so further down the data and then further I can extract this underscore ID yeah that's that's messy and what we're going to do is just below this profile page we will get an H2 and this H2 will get some data so if the data is there do something do get available just like this uh probably not we'll just first get the strings otherwise do something else so what is happening so if there is nothing inside the data so what we can do is we can write some of the things let's actually evaluate this that would be better if data equals nothing because that's the default State remember nothing so if data is nothing then we'll be saying hey this is nothing so let's just go ahead and inject nothing here just like this and if there is some data then we can actually go ahead and inject instead of this string let's go ahead and give it a link as well so I'll just go ahead and say link just like this okay and why is it giving me this problem here that oh href is missing okay I can I can add that no problem and I'll move it to the next line now I'll do it here okay href okay where do I want this one to go so I'll use the back tech I'll say slash profile okay but since I have extraction of the ID now I can go ahead and Slash and put this data although we should be calling it as ID but I think that is good all right now uh one more thing who will be calling this uh there is no button to call it all right so let's create another button who can actually call this so I'll just duplicate this one and I'll say that hey you will be responsible for get user details so yep get user details I don't think you will be happy as a blue so we'll just go ahead and say you will be what a violet purple you you get purple a little darker shade of purple 900 no I'm not happy with this okay uh what else colors uh green yeah will will go green 800 cream okay I know okay so this still says logout this shouldn't be saying log out this will be get user details all right uh right now it says nothing which is good I also want to actually highlight this nothing as a little bit so we'll say class and we'll be having a little bit of padding rounded and we'll be having a BG Dash I'll use green this time not the orange you made a lot of fun of that and we'll be saying 500. and padding not padding like this what am I doing betting Dash three let's go yeah better okay so let's see get user details and there we go right now we are having an empty that means we are not getting any user details let's see what we are going doing wrong it says a message user found and then we have this data and username and email okay so this is coming up into the rest or data so what we have to do is res dot data and then inside that we need to go inside the data and then we need to grab the underscore ID and then we actually can grab the ID so I think this is correct why it is not mentioning the details here so let's check what we are doing wrong in this case okay okay my bad my bad I actually didn't set up anything inside this link my bad we never injected the variables so my bad so we need to inject this data here so the URL was there but the value was never there ah there we go totally a small bug so now we can actually click on this and there we go not looking good this profile should be a little bit above but anyways you get the idea that how we are able to grab the user so now any user we are able to track him down so that's nice and the log out middleware that's working nice get user details we get this and now we can actually click this we can actually grab all of this so instead of running this method on a button click just like we're doing here we can actually use and use effect hook and just whenever somebody visits this page we can load his information there and can directly just display there so I think that's a that's a great start that we have done so that's really nice and I think this is wrapping up our application quite a lot that we are able to do so much in this one I'm super happy that we are actually on this phase that it's working nicely now a couple of more things what we can do is we haven't talked about how we can utilize the mail trap which I actually discussed it's probably logged out so we haven't discussed that I'll close this one I'll close this one I need to push this on to GitHub as well so let's go ahead and do this and I'll go ahead and say hey let's add every things like this and we'll be saying added middleware come on added middleware and what else we have done we have added middleware we have also worked on me route okay Commit This and of course we want to push it all right so that you can see the repository is available on my GitHub account it's pretty easy to find you can definitely easily find that all right so I think that is uh what we'll be doing in this video but there is little bit more that we need to have an action plan so we have gone through with quite a lot of details in this one we have gone through with the middlewares I showed you how the how to protect some pages routes and all of that from the server side grabbing the cookies and all of that couple of more things which are easier things now is how we can first and foremost shoot an email so obviously we'll be creating a helper file for that and once the email is being shot how now the values are there in the database so I want to update the values in the database that's my concern now get this token into the database as well and send this token to the user email as well that's what my action plan is right now and obviously we'll figure out the plan as we go we make a lot of mistakes and all of that so that's that's a part of the things I hope you are enjoying this series if you want more details or more projects or something let me know in the comment section I'll definitely love to do that for you guys and consider hitting subscribe there's a lot of effort going on I would appreciate that let's go ahead and catch up in the next video or if you're watching all in continuation just a small break and catch up on the other side
Info
Channel: Hitesh Choudhary
Views: 28,213
Rating: undefined out of 5
Keywords: Programming, javascript, reactjs, nextjs, vercel, mongodb
Id: UgRw9lhhWDk
Channel Id: undefined
Length: 41min 39sec (2499 seconds)
Published: Fri Jun 30 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.