URL shortener - MERN stack portfolio project part 1 | API routes and mongo db

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
all right all right Welcome to The Gaslight Channel my name is bikas and I'm here with another exciting video something that you have been requesting for a while so a fully stack series here and as you can see in my fake my screen here it's called easy link so we are going to build a small uh application web application so this can be your portfolio project and this is also good opportunity for you to understand hold from Front End back-end database and everything so a typical mod fully stack project we will be building a very simple yet very useful application and that will be URL shortening you know there is btly or Google where you provide a long long URL and then it will give you a sort code and then you can use that and it will redirect you to the original URL so that's what we will be doing if that sounds exciting if that's what you are looking for then smash the like button if you are new to this channel uh feel free to subscribe Channel with that being said let's start the video [Music] all right so the first part of the video we will be dealing with back in part and when I say back in we will be dealing with a node as well as mango DB so that you can send a request with original URL and you will get back a sort URL and then if you enter that sort URL you will be redirected to the original URL okay so that's what we will be dealing with so before we proceed let's have a quick look with figma here so the final product or the final project will be with all this logging screen and and so on with all the dashboard and and the way to uh make or edit all these links as well as also there is a dashboard View and the I mean the desktop view and there is a mobile view however first let's start uh for the back in the server part so so first uh let's go through the high level flow so how does exactly to work especially in the server side so we'll send original URL okay there will be more description but main idea is there will be original URL with linter or user will enter and we'll check if that exists if it exists then we will written a sort URL for it and then our program will end or the process the flow will end if not we will generate URL code so that will be those sort code and then we will store it in DB and if the storing in DB in our case mangodb is successful then we will return this 201 that is created and then end okay so we will also return some response there as well as if in case there are any errors then we will also show you the maybe the possible error and then we will end so that's uh how you enter URL generation and then there is also per sort URL redirection so this is a case where you already have generated sort URL and you are entering that how to redirect it to original link so so for that will interrupt so someone will send the request to certain your url with with the sort URL and then we will search in DB and see see if that if URL code exists if it exists we will also increase our counter so if you see in our design here we even have a visit count so that's what we will be dealing with so we'll do that and then we will redirect to original link okay before it's not found and then we will need so that's the flow to start uh I have this in my biggest web of guitar there is Easy Link application it's a public Ripple so you can just clone this and remember I have a couple of uh here uh branches so this will be a fresh start so so if you want to follow along with me then I use this price to start because this master and tutorial plans will be already full of codes by the time you will be seeing this because I will be dealing with this tutorial Branch okay so this is just a typical setup and then there are a client that is a create react application with type script and then server that is node and express with typescript and we will add rest of the thing as we go okay so here we are inside our vs code and you can see the same polar structure easy easy link application there is a client there is a server and then a client we will not deal with it in this video but we will be dealing with server Okay so so first thing first if you see we have to set up our mango DB okay and before that let's jump into server I'll just clear it and then I think there should be something called and Dave okay so first we need to do and install and before that we will install some dependencies so the first one being let's just do that and that will be mangoes because that's what we are going to deal with mango DB and then there is another something called generate password so this is what we are going to use for creating uh sort URL code all right so those are installed so now let's just do an install and it's already installed okay so the next one is and dip and we have our 501 Port started so if we go to postman we do a git and so we have localhost okay so let's send request okay so it says it's gonna get maybe because we have nothing there so let's go to our SRC so yes we have solver running but we don't have any route or any setup so the next thing let's go and let's create a couple of folders okay so the first folder will be config where we will have all our configures and related such as database and so on next one will be models so the models is where we'll have all our database schema and so on so that model is what will be used to give the database safe we want and then we will have another and that will be routes because to handle all our routes in our case for now for this video we will have URL route but later we'll also have user route okay and then the next one will be services so okay sorry I don't need there but inside here okay let's go and let's have services and then the services is basically just a practice uh usually I do it so that everything that is interacting with the database with our models and everything we will do in Services okay and then uh the last one for now will be types we might create a controller but let's see how we will deal with that later okay so now we have config models route Services types types will be everything that we will be typing with so because this is a typescript file so we want everything type defined okay so the first thing let's go with a config okay before that I'll tell you in the server root folder you can use this okay so we have Port 501 and then also I will write mango URL oh it's weird you will be entering your mango DB URL which will which consists of the username or admin name or whatever and then passport and then the server name okay so in my case I have this mango DB and then the server slash less so here you will be using your database username uh so and then here you will be using your password so whatever password you will get some some kind of this format and then here you can use localhost and then the port number where your mangodb is or whatever URL you have for mangodb so that's all you need to do you need to create a DOT EnV file and that actually should be [Music] wrong I will I'll just move it so it should be in the same way we have dot e and B example okay so I moved this uh the DNB here outside so the next is uh we'll go here and we'll go to config and we'll just create a file called DV configure we can just have DB and this will be also type script file so let's go inside our config file then I'll just copy paste this so what this does um okay so let's go and see so we have something we have imported mangoes from mangoes and this stick query false I did it because there was some issue with the worsening and so on and then the next one is we just have created this this function called dbconnect which is async function and we have tri-cats so let's over it so what it says okay so it says it does not exist in something so let's just remove this for now and this also does not exist okay we may edit later so we just have like if it's connected we'll say DB connected if not it will show us any error message that will be caught okay so now let's go to our application here and then we can import DB config from config file and then DB then this is a function so we need to call that function it's really list source I have the proper name so we want that Divi connect to Ron after our server runs so somewhere here okay so DB connect and then we do that and if everything is good like you see here it says database is connected so that means we have successfully connected to mango DB in our case this is in mango Atlas in your case it can be in localhost and so on okay so the first part is done we have now server running and it is now connected to the database so the next part is we'll create a route okay so let's go to our route here and inside the route folder I will create one index ETS so okay so the reason why I'm creating this index.ts is because I just want that all the routes we will have so in our case we will have URL and user route but in your actual application you may have a lot of multiple routes so I want to import all of those in index and then use that index as a main route you will understand what I meant by it so for now let's just go to import something from Express and that's something will be router okay this will give us a routing option and we can have an instance of it so router and then what we can do is we can say router.use and then whatever we want in our case we have URL okay and then for now we can have something don't worry later I will actually give the proper type definition and everything but for now it's just for testing so I'm not going to do anything let's just say 200 and then we'll use something called send up in that case I will do router dedicate okay so we need to use this somewhere so to use this we can go to our main app.ts and then we can input it so let's go here and under this I want to import from our routes okay then we want to use it somewhere so like that we can we already have a so let's go after DB connection so we can use any set router and we can even have some patterns so let's just first Now do app.use and you can you can uh just do something like this here and then give best router and that is okay so when we have this we are getting some issue here and it says base router Okay so there is some problem and that is we have to export this router here and now we have exported so everything good so if everything is good then we should be able to send a get request to URL so let's go here and then I just do URL says hello because so our whole routing process is good however I have this one practice that I usually follow and you don't have to but the idea is I would like to give API here and then if I have API obviously this route will not be called so and the reason is and then I will always like to give all the routes here we'll use so API so that is example will be the reason why I do this is sometimes we might want to have different kind of approach or different kind of API versioning and so on so it's better to have this one extra option okay but as I said it's not necessary so now we have to go here and then we have to add API here and if I do something like this you see you get hello because okay so we have already created the first route and then there is also one more thing I usually do that is I like to print all the route calling for this all I'm going to do is I'm going to just do EF dot use and then it will have you can see something and then request and that will be request type and then we'll have response and that will be the response type and then there is something called next that is next function and what it does so first thing we need to import from here request and response so you know all of our route call when we are making request we have request which we can get a lot of thing inside this request and then we have response that is when we get a request we can respond something back okay just like how we were responsing hello because here with the status code okay that is something and then there is a next and that is sometimes we may not want to response but we may want to pass this to other route calls or other other stops and it's super useful in middleware but we are going to use this also here so I have this uh console log I'm just giving it out call I have a template history and then we have requested method that tells us if it is a get method or post method or other type of methods and then we have also doing a request original URL so it tells us what is the original call made and then there is a next function okay so once we save this so now if we go here if I make a call you will see it says route call and the type of the route was git and then it was called slash API slash URL okay so this is something just for uh a better debugging letter I just wanted to show you this one okay so the next thing we already have router here so we want to actually go and do something in our model and let's go here and let's call it URL tomorrow okay and that will be TS so now this is the time we actually do something with our modeling with our mangoes so first thing let's go and let's have mangoes from mangoes okay and then the next thing is we will create URL schema okay it's just a name because this is URL models so I call it URL schema and we will use something from mangoes and then it has a schema and inside the curly bracket it takes all the characteristics of your uh data so what I mean by characteristics are all these so we have these items so let's just go and paste it here so I will go here and I have ID that is not needed because as I said uh mango DB automatically does that so the next one is we want URL code and then you need to define the type so the type will be string remember for mangoes we need this Capital string unlike a normal typescript where you can also type the smaller one and we want this to be 2 because for each of the link We are saving we want that uh it has a URL code and and we also want this to be unique because we don't want that for two different original URL we have the same URL code okay so the next one is original link so actually let's just duplicate this here we can have original link okay and then original link type will be string required is true because that's what we are anyway dealing with this URLs and then we also want that to be unique just because if you see here in our flow if it already exists we are returning it so we are not letting a duplicate of same URL okay some people might do it some people might let it it's our decision and we decided not to okay the next one is name and then name is also type string and we can say do we want a required we don't want this to be required because it's okay if you want to have it if not actually in our UI we can even so instead of original URL or our name we can even show original URL or whatever but we don't want that name should be mandatory okay so every time we create something it will automatically be there however we will also have something called updated it and for this specific need we may not want need it at least in our UI we don't have anything to do with we just have added date but we didn't have updated it but it's just a practice that I usually follow that if in future we want to know that when was the last link updated or so on or when was the last link it says it's up to us we can use those but for now I'll just keep it there and then let's delete these Okay so we have a pretty nice schema and then all I need to do is I have to export default this and then there is mangoes and remember we had modeling here then we can give the name of model to then we urine so this way we have our model and whenever you are using it in in a mango DB in the collection of URL kids that's what we will have here it will have all these figures plus of course ID okay so now we have the model the next is we want to go and we want to have our post out for post request before that let's go to our services folder and then here we can have URL services okay and the reason why I'm having this URL Services is you see we have a best router URL and then we will have a new router called URL router here and that router will actually handle everything and instead of this we will actually use that URL router from there so that's what we will be dealing with and then inside that URL router we'll have a post route where we will be getting all these all these values you like from the from the request and then after that our route or our URL route will forward some steps which services will handle Okay so let's go here and we want input from URL model because that's what we need and then first let's just create so you want to create services so we can just export const create URL or yeah we can call it Trail URL and we will have a payload and then for now I will give any but soon we will Define the types and then we will have try and cats okay and here we will have const URL is new we have that model there and then we'll pass payload okay and then we will do a weight actually we can just do it here that we can have URL is a width URL first we have this URL which is the instance that uses this model and our payload needs to be also the thing that we are expecting all the required thing it needs to have it and then we are just saving it and then also attaching it in the same variable so that we will get the ID and everything and then we are returning URL okay and if there is something we'll just create error and we'll throw it okay so this is our create service later we also have a get service but for now let's just have a create service okay and this is not necessary like you can import this URL directly to your route or anything or even your controller and so on and then you can directly use it but it's just that if you have multiple things to do if you want to create hashes and you know there can be so many thing you are doing here in that case you can always have this function so that you don't have to repeat the same thing again and again for example even in this case we have all these try cats everything so we don't want to repeat it we just want to click call this function and pass the payload so before we move on to next I would like to create a type and usually I just want to create index that's that's my way of doing it some people do it some people don't same with routes you can have index.ts and then you can also have another type and that is called URL types so this is completely not necessary you can directly input things from URL type but it's just as I said my practice so here I have to do export type and I can say URL payload type and then here let's go to our model here so all the required thing are URL code original link name is and visit count visit count is actually not so okay so what we can do is we can have URL code and that is string then we can also have foreign and then we have name that is a string but that's not mandatory so this is the payload that we are expecting here and then here what I can do is export everything from URL type so that way any way we want we can just import URL payload type okay so you see it imported from types I can do something like this so that the more thing you keep on adding and then you will just export from index all you need to do is just use this one import and then you can have multiple input here instead of having import from URL type import from some other thing so that's just the practice then the so we have these and then we may want to take one thing here so okay so we will do some more thing here so we have like payload so if we don't have payload Dot Okay so URL payload type probably we don't want URL payload type we don't want like URL code there so if we don't have original link then we just want to throw error we can say missing then this is something that actually already in the route label you can use some external validating and you can validate everything such as email and if it contains only string or does it contain some like query or something so you can use those kind of validator but in this case we are just going to use only this and then here I can also do one more thing let's go let's import this General from generate password and we just give this idea so here what we can do is we can create we can create a URL code and that can use this one and then you can pass how how long you want you can have a six or eight so I will just do it do you want numbers and that is true we don't mind with numbers and then to you one uppercase we want so something is here okay so we have length and we can even have uppercase so this is our URL code and then what we do is URL Dot URL code is will pass that URL code so this way for every request we are creating a URL code and we are saving that so I think this should do so with that um now you see why we needed this function because we didn't want to do all this thing in route so let's go to our routes here and then inside the route will create something called URL router and then I will import couple of things so one is this from Express just like earlier and then we will have also if we will import model um it says like these okay and then we will also import our services so that will be create URL okay so that is done same thing we do so we have expressed our router or we can actually directly even create a router from here so let's just do it like that in that case again just to router here and then we go with our first post route so remember we will be using this inside URL so the slash means the URL and then we will have sync request will be type request response will be type response and then we do something here and now at this point this is a way this is a place where you may want to have middle way to validate things so that you are exactly getting things that you are expecting and nothing else for example in case of user email you are getting email in the email valid format if it is something we are expecting in number then it should be number and and so on you know so that we are not getting anything else that's up to you I'm not going to deal with validation in this entire project maybe just a basic way of checking it but not exactly validating it but that's very important and you know how to do it also there is another approach and I have seen it in multiple places so instead of doing everything here now inside router just like Services we can also have something called controller and the idea would be that inside Services we will only do thing that is related to calling and deleting editing everything with with our databases however for example we had this URL code and there can be many other logic that we want to make sure everything is handled before we are calling this function so in that case there is a practice of using controller but this is small project I am not going to do it but you can do it and in that case you will have a separate thing called controller and then instead of calling all these you will just say route for example create URL controller and that will be somewhere in controller folder and that will already get all the request response everything and you do everything even validation and so on however I'm not going to do that I'm going to do everything here in the route okay all right so the next thing we want to do is if you go here and if you see in the flow so we will get original URL and if the URL exists so we have that case to handle and for that we I can write here to do you can move this to a separate controller so what we are not going to do it so we will get something from not from from requested buddy I told you this request has body it has params it has methods and so on okay so that's a request type and then we are getting something from body and that body will be what for example for the Post request so let's go here and then for the Post request we can use body here and we can say from data actually [Music] we can go and do Json here so we can pass something from here and that will be caught in this body so we will be at least expecting original link um I'm just making sure that we don't have mismatch with things so in the type we have original link and then in the model we have original link okay that's good so we have original link and if we have original link we can try to do something so so if we have what is in a link will do something else else we will do something okay so that's the case so if there is nothing we can even show them like a bad request or yeah so that they are not sending us things that we need so I guess we are at least expecting original link okay and then the next one is if we have original link then still there are few questions so first I'm gonna add try and gets okay since this is async we want to cut things and so on so first thing is we want to see if we have URL or actually if you are exist already or data exist we can even call it data up to us but just for the sake I will call URL or URL cutter so let's just sort so let's try to find because we have already this model and then we can just say find one and then here we can pass originally so you see this is what I was telling you that we can already directly use this so we don't need this kind of services however there are all this extra thing we might want to do and services are helpful okay so the idea is we want to make sure that this original link does not exist already if it exists so if we have URL data okay there are a lot of you if and else of course you can have some other way to deal with but I don't mind having this if and else at least in this case having this kind of like guard ways for checking if it doesn't exist and throwing I I don't like that approach in in many cases because this kind of code are easier to read at least when you don't have so many nested in this case we have one if another if maybe we'll have one more and that's it okay so URL data so if we have that all we want to do is okay so this is up to us but if the data exists we may not want to redirect those people directly to that but we just want to tell them that something exists and that will be useful later in our application so when someone tries to enter this new URL and edit then we can say that this already exists so we can show it anyway so we are not using this to redirect but just to tell them that you already have this link Okay so for that we can just use Json and then we can just pass URL data okay so that's the case if it exists if it does not and then we go to this our flow so if it does not exist then we were going with this so in that case we can still use the same variable and then we can just say a weight and we can use this create URL and then we can pass request dot body or we can even just have const data so now if we have data we will call 201 that's created and then we will pass the data if not so we still have cats here and we want to see what is the error and then if you have some logger you can use that logger instead to log it and then we have status for now let's just give this because most probably it's not user's fault of course we can say all right so now you saw that we have actually created a post route we still have one more thing to do because we have this route but we need to add this in our index route here and that's what I was telling you so we can call URL router so let's go here import URL router from you are a router and then you can use this here okay it seems like we haven't export anything like earlier okay this is wrong all right so anything related to URL we will do all the post gate update anything we want we will do inside this and this route as I said this you could directly use this here so instead of API and best router you can have we can some do something like app.use and then we have API and then we can do URL and then we can have URL router here and that also works but as I said we don't want to import so many things in application but we want to do that in individual file here in router and that's why I'm using this index in many places as you see I use that also in type here I did that we could actually also do it in Services we can have index here and then all this file we can actually import there and then export from there so we could use it like like that but I think this is okay for services so if we go to postman let's try to create a post request and let's see what we get okay so we don't get anything it says 404 not pound okay I think the reason here is I should not do kit there I should do use there because we do the get and everything inside here okay okay let's go here okay so it says missing required parameters and that's true because we are not passing anything in original link so let's go and here we can open something like this or it's in a link and then this will be let's just write google.com test so okay it still says missing required parameters and let's see why Okay so if we go to URL Services I think it's coming from here or is coming from here okay so at least okay so let's have a debugger here I don't know if our debugger is actually working seems like it's not working properly if we don't have original link so let's see if we have typo and we do have typo okay so okay so internal server error and and that means we are getting here somewhere so it means something is happening so all right so I had to debug a bit and all it all I was awake here and because of that it was going here obviously because without the weight these are async action because it's calling DB and so on so it might take some time and that's why we're not having any result however now I call it and we have something so you can see we have ID that usually we get from mango DB itself and then we have URL code this is exactly what we wanted and then we have original link and then we have visit count which is 0 by default and so on all right so uh if I do the same I should be still getting exactly the same one because that's what and it seems like nope Okay so we might have some issue here because if we pass the same original link we should be getting same URL so seems like we have some issue here so we will try to get URL data by passing that and if we have data we are sending the rest respect that that are not will create URL and then we are passing that data so here we have 200 okay so that means we are actually getting back the same data otherwise it should create so this remember we have gkl at the last and we still have gkl as the last yeah that's true so this is and then the ID is 799 at the end and ID is so this is working yes we want it okay and there there is a small thing that I want this idea I don't want with underscore and then I don't want this person in so there's a way to remove that and for that we need to go here in the model and I just have something that you can copy paste sold you can get it in the docs or you can even Google it how to remove the worsening and so on and for that there is this thing I just basically copy paste it so your schema this so virtual's true version key we will remove it and then we will transform and we'll take this reference ID so now if I save this I go here if I do this you see we have all the thing we want obviously it's not increasing uh visit count and that is because we are not increasing the visit count per already exist one we are only increasing when someone enters and we redirect them okay so that's the reason and it's it's done according to how we want it all right I think one more thing we might want or probably we can even add that from the front end because if we have this when we are showing it in the front end in this kind of table here so we can add this UI URL there itself in the front end so we don't need to do anything here however let's go and let's handle the gate route okay get so the reason is get URL like URL code we can even have it with ID but we don't deal with idea we deal mainly with so we just want URL code and that is string then what we want usually in type script is also good practice that you write here what you are returning and I'm not doing it now but it's a good practice to do that so we have a string and then we will add try catch here so and then we are not going to test this URL code because it's a mandatory and we need it so what we can do is we can have data and we already have a bad practice somewhere we are calling it URL somewhere we are calling it data but it really doesn't matter so we want data and then the data is a weight and then URL dot find one we cannot use pine by ID because we are using it with URL code here so if we have data if we don't have data then we can throw error we can say that request or we can even say not pound but I think this is okay because we will already do it in route here that if it is it doesn't exist or something okay so we'll just send a bad request here actually would be good to send 404 for now I'm just gonna do this and then if we have data so if we go after this that means we have data then we want to do two things first is data Dot visit count is data dot visit count plus one that is what we want and then we actually also want to save data we can actually um we have to save this we have to update this so first data Dot debt data I don't know if this will exactly work we'll see and the reason I'm not adding a weight async is we don't need to wait that okay but that make because we want to return the data as soon as possible to the user however we want to catch something and that is we want to also console log error here and then we just want error okay so let's see if this work if not we'll modify it so we'll go here then here router.get and then we want URL code and then here we are using this service so that is gate URL by URL code create URL by URL code okay okay I think that's not going to work and that should not work because that's that's our controller way so here I'm going to copy this one and then I'm going to paste this and then close this so what we want is we want URL code and that comes from records dot params.url code because we are getting this here and same thing also in front end when you have a router or something set up we always Define this and whatever we Define this we can get that as a splitted comparems and then that will be viewer code you can just even say code whatever in some case we might need ID in that case we can get that ID so this is URL code and then so so the the the URL code so if we don't have URL code if we don't have URL code we actually already want to response status and here we want to say bad request because we want that there needs to be something after slash okay okay so the next one is if we have a URL code what we want to do is now we want to have tri-cats and then here we want to have const actually yeah so we want data here and data will be await and then get okay and if we have data we want to do status 301 that is redirection and then link so that's what we can do and we are getting some issue here okay and I was kind of expecting that and I think it does have original link okay is it so oh no I think its problem is here so after three zero one we have to say redirect and then pass that so I think we have good so the idea how this should work is like in our clothes out here so someone is now entering the sort URL okay so the sort URL will be our our domain names let's uh this URL code and then it will search in the DB if it does not exist it will return for over uh in our case we are returning something else we have to handle that we can handle that but if it exists it will count plus one and then it will redirect here actually this count plus one I can even write somewhere here because it doesn't apply here but anyway you got the idea so let's go here then let's try here so first thing first I'm gonna make steal this request okay so we have this URL so this one I will go to the get one and then we still need that and then I will paste this so if everything goes good I think from we should do it from somewhere else then Postman here because every request we do in url in in browser is actually uh yeah everything we do here uh in in browser is a get request so if I send this it should actually take us to the original link and you see it does so it redirected us to the original link let's see what happens if we do this here okay so we actually got 404 not found and why is that so it says us 404 not found maybe because it doesn't let us realize it from here however from here it does so let's try one more URL so let's say we have now a new URL and that is facebook.com so now these things should change because we will have a different ID and it did so now I can copy this and then I go here and this is what I was talking about base URL because in in reality you will have your domain name something like let's say bigash.com and then slash and then this code and then when they enter it it will take them to the original URL so this is I actually want to sort something that has pretty long URL okay so this has pretty long URL and we might not remember this or our user or if you are sending someone text messages or something they might not remember this or if you are sharing in Twitter Facebook they might not remember this so let's convert this URL this is actually also a way to check it if it supports this sort of long URL okay now let's send it okay so we have originally URL and then we have sort so we got our sort from here then I will just go to localhost and then this last one I will paste here if I go you see it will redirect us to this one so this way our first part of the uh of this project is done so in the first part we connected DB we made a couple of actually one model we made one services and then we have one router at least the main concept of our application which is that you provide original link it will give you the sort code or actually full URL when we attach it to UI and then with that you can actually call that sort URL and then it will redirect you to your original long URL okay so that is our minimal version and we did that so in our next video you will get all the playlists and everything in the description and so on of each other so so wherever you are watching you will be getting a link for other videos related to you so the next one we will go and we'll try to attach this to this kind of approach we will probably not have profile it because we still don't want to introduce user but we'll just want to have the UI version from where you can create a new URL and then you will get a sort URL you can copy it and so on and then you will realize that with that approach you can always only create one-time URL and that's it and then you cannot edit it you cannot do it so on and then and then that's what we will handle with a profile and so on so that's all for today's video I hope uh this was useful for you and if you agreed please smash the like button for upcoming videos on this series please remember to subscribe my channel and also press the Bell notification icon so that you will be notified whenever I upload new videos thank you so much for being here until this point with this video and I hope to see you in all the video series as well until then keep coding bye bye [Music]
Info
Channel: Bikash web
Views: 1,765
Rating: undefined out of 5
Keywords: bikashweb, front-end development, how to be a web developer, MERN stack, full-stack, url shortener app, full stack porftolio project, node js and mongo db
Id: pj3wK8d6IqU
Channel Id: undefined
Length: 59min 17sec (3557 seconds)
Published: Sat Feb 11 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.