title
Build A Node.js & Redis App From Scratch
description
In this video we will build a user management application using Node.js and Redis which is an open source database/caching system. We will be able to add users to the system and search for them by id.
CODE: Code for this video
https://github.com/bradtraversy/redusers
YOUTUBE REDIS CRASH COURSE
https://www.youtube.com/watch?v=Hbt56gFj998
FULL REDIS COURSE: Please Use This Link
https://www.eduonix.com/affiliates/id/16-10420
SUPPORT: We spend massive amounts of time creating these free videos, please donate to show your support:
http://www.paypal.me/traversymedia
http://www.patreon.com/traversymedia
FOLLOW TRAVERSY MEDIA:
http://www.facebook.com/traversymedia
http://www.twitter.com/traversymedia
http://www.linkedin.com/bradtraversy
detail
{'title': 'Build A Node.js & Redis App From Scratch', 'heatmap': [{'end': 929.931, 'start': 902.771, 'weight': 1}], 'summary': "Tutorial series 'build a node.js & redis app from scratch' includes chapters on creating a user management app with node.js, express, and redis, setting up node.js projects and express app, creating routes and search users view, building user search form and rendering search users, user details and functionality, and user management in node.js, offering a comprehensive guide with practical instructions for linux, mac, and windows users.", 'chapters': [{'end': 65.406, 'segs': [{'end': 57.911, 'src': 'embed', 'start': 26.94, 'weight': 0, 'content': [{'end': 31.296, 'text': "all right, it's not required that you watch that before watching this,", 'start': 26.94, 'duration': 4.356}, {'end': 35.779, 'text': 'but i think it would give you a better understanding to what redis is all right.', 'start': 31.296, 'duration': 4.483}, {'end': 40.141, 'text': "i'll also show you how to install it, because i already have it installed.", 'start': 35.779, 'duration': 4.362}, {'end': 44.604, 'text': "if you're using linux ubuntu, you can use your apt-get packager.", 'start': 40.141, 'duration': 4.463}, {'end': 52.348, 'text': "if you're using mac or windows, you can go to redis.io, click on download and you can download the tar file here.", 'start': 44.604, 'duration': 7.744}, {'end': 57.911, 'text': "but if you're on windows and you want the installer, you need to go down to where it says windows and click learn more.", 'start': 52.348, 'duration': 5.563}], 'summary': 'Transcript covers installing redis on different platforms.', 'duration': 30.971, 'max_score': 26.94, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA26940.jpg'}], 'start': 0.689, 'title': 'Creating a user management app with node.js, express, and redis', 'summary': 'Covers creating a user management application using node.js, express, and redis, with a brief introduction to redis and instructions on how to install it for linux, mac, and windows users.', 'chapters': [{'end': 65.406, 'start': 0.689, 'title': 'Creating user management app with node.js, express, and redis', 'summary': 'Covers creating a user management application using node.js, express, and redis, with a brief introduction to redis and instructions on how to install it for linux, mac, and windows users.', 'duration': 64.717, 'highlights': ['The video demonstrates creating a user management application using node.js, express, and redis, emphasizing the importance of watching the preceding redis crash course for better understanding.', 'Instructions are provided on how to install redis for Linux using apt-get, and for Mac and Windows through the redis.io website, including a specific guide for Windows users.', 'The chapter provides a brief overview of redis as an open source database caching system, stressing the importance of familiarity with redis and its data types and commands for the subsequent user management application.']}], 'duration': 64.717, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA689.jpg', 'highlights': ['The video demonstrates creating a user management application using node.js, express, and redis, emphasizing the importance of watching the preceding redis crash course for better understanding.', 'Instructions are provided on how to install redis for Linux using apt-get, and for Mac and Windows through the redis.io website, including a specific guide for Windows users.', 'The chapter provides a brief overview of redis as an open source database caching system, stressing the importance of familiarity with redis and its data types and commands for the subsequent user management application.']}, {'end': 398.65, 'segs': [{'end': 92.152, 'src': 'embed', 'start': 65.426, 'weight': 0, 'content': [{'end': 69.772, 'text': 'All right, so just get that installed, set up, and you should be good to go.', 'start': 65.426, 'duration': 4.346}, {'end': 73.498, 'text': 'All right, and obviously you need to have Node.js installed as well.', 'start': 69.792, 'duration': 3.706}, {'end': 80.362, 'text': "Alright, so what I'm going to do is I'm in my projects folder and I'm just going to create a new directory for this project.", 'start': 74.557, 'duration': 5.805}, {'end': 85.486, 'text': "And I'm just going to call this redusers.", 'start': 80.982, 'duration': 4.504}, {'end': 88.929, 'text': "And we're going to cd into redusers.", 'start': 85.986, 'duration': 2.943}, {'end': 92.152, 'text': 'And then we want to create a package.json file.', 'start': 89.73, 'duration': 2.422}], 'summary': 'Install and set up redusers project with node.js and package.json file', 'duration': 26.726, 'max_score': 65.426, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA65426.jpg'}, {'end': 170.199, 'src': 'embed', 'start': 115.308, 'weight': 3, 'content': [{'end': 120.212, 'text': "I'm using Atom, but obviously you can use whatever you'd like.", 'start': 115.308, 'duration': 4.904}, {'end': 123.655, 'text': "Let's see, red users.", 'start': 120.232, 'duration': 3.423}, {'end': 125.096, 'text': "All right, so let's open that up.", 'start': 123.815, 'duration': 1.281}, {'end': 127.077, 'text': "And there's the package.json file.", 'start': 125.236, 'duration': 1.841}, {'end': 130.32, 'text': "And what I'm going to do here is just create a start script.", 'start': 127.778, 'duration': 2.542}, {'end': 135.238, 'text': 'And we want to change this to node app.', 'start': 132.117, 'duration': 3.121}, {'end': 141.121, 'text': 'Okay, so that will allow us to run npm start to start the application.', 'start': 135.979, 'duration': 5.142}, {'end': 142.962, 'text': "All right, so let's save that.", 'start': 141.861, 'duration': 1.101}, {'end': 145.023, 'text': "And we're going to install our dependencies.", 'start': 143.182, 'duration': 1.841}, {'end': 147.784, 'text': "So let's see, we're going to need a couple things here.", 'start': 145.683, 'duration': 2.101}, {'end': 150.165, 'text': "We're going to need express.", 'start': 147.804, 'duration': 2.361}, {'end': 153.846, 'text': "We're going to need body parser.", 'start': 150.765, 'duration': 3.081}, {'end': 156.127, 'text': "We're going to need Redis.", 'start': 153.866, 'duration': 2.261}, {'end': 159.709, 'text': "Let's see, we're also going to use method override.", 'start': 157.608, 'duration': 2.101}, {'end': 165.017, 'text': 'And what that does is it allows us to make a delete request from a form.', 'start': 161.275, 'duration': 3.742}, {'end': 168.258, 'text': "Because normally you can't do that.", 'start': 166.398, 'duration': 1.86}, {'end': 170.199, 'text': 'You can only make get or post.', 'start': 168.298, 'duration': 1.901}], 'summary': 'Configuring start script to run node app, installing dependencies including express, body parser, redis, and method override.', 'duration': 54.891, 'max_score': 115.308, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA115308.jpg'}, {'end': 295.031, 'src': 'embed', 'start': 205.136, 'weight': 1, 'content': [{'end': 206.536, 'text': 'This is the main entry point.', 'start': 205.136, 'duration': 1.4}, {'end': 208.377, 'text': "We're going to bring everything in.", 'start': 207.017, 'duration': 1.36}, {'end': 210.017, 'text': "Let's say Express.", 'start': 208.637, 'duration': 1.38}, {'end': 213.958, 'text': 'And we want to require Express.', 'start': 211.998, 'duration': 1.96}, {'end': 220.959, 'text': "We're also going to bring in the Express Handlebars template engine.", 'start': 216.278, 'duration': 4.681}, {'end': 223.32, 'text': "So let's say EXPHBS.", 'start': 221.019, 'duration': 2.301}, {'end': 230.454, 'text': "Okay, and that's going to be express dash handlebars.", 'start': 227.233, 'duration': 3.221}, {'end': 237.215, 'text': 'We also want the path module, which is a Node.js core module.', 'start': 232.714, 'duration': 4.501}, {'end': 241.596, 'text': 'And we want to bring in body parser.', 'start': 239.795, 'duration': 1.801}, {'end': 253.398, 'text': "Let's see, body parser, and let's see, method override.", 'start': 249.537, 'duration': 3.861}, {'end': 269.083, 'text': "Let's see, let's do method override and set that to require method override.", 'start': 256.82, 'duration': 12.263}, {'end': 271.644, 'text': 'Okay, and then finally we want to bring in Redis.', 'start': 269.364, 'duration': 2.28}, {'end': 278.866, 'text': 'All right, so now we brought in everything.', 'start': 277.046, 'duration': 1.82}, {'end': 281.327, 'text': "Now let's go ahead and set our port.", 'start': 278.946, 'duration': 2.381}, {'end': 289.707, 'text': "So let's say const port, and we'll set it to 3000.", 'start': 285.464, 'duration': 4.243}, {'end': 295.031, 'text': "All right, and then let's init the app variable.", 'start': 289.707, 'duration': 5.324}], 'summary': 'Bringing in express, express handlebars, path module, body parser, method override, and redis, setting port to 3000.', 'duration': 89.895, 'max_score': 205.136, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA205136.jpg'}], 'start': 65.426, 'title': 'Setting up node.js projects and express app', 'summary': 'Explains how to set up a node.js project, including creating a directory, generating a package.json file, and configuring a start script. it also covers setting up a node.js express app by installing dependencies, creating the app.js file, configuring the view engine, and setting up standard middleware.', 'chapters': [{'end': 142.962, 'start': 65.426, 'title': 'Setting up a node.js project', 'summary': 'Explains the process of setting up a node.js project, including creating a new directory, generating a package.json file using npm init, and configuring a start script to run the application using npm start.', 'duration': 77.536, 'highlights': ["The process involves creating a new directory for the project, named 'redusers'.", "Generating a package.json file using npm init with details like description, entry point, and author's name.", "Configuring a start script in the package.json file to run the application using 'npm start'.", 'The importance of having Node.js installed for the setup process.']}, {'end': 398.65, 'start': 143.182, 'title': 'Setting up node.js express app', 'summary': 'Covers setting up a node.js express app by installing dependencies such as express, body parser, redis, and method override, creating the app.js file, setting up the view engine, and configuring standard middleware for the app.', 'duration': 255.468, 'highlights': ['Dependencies installation The chapter covers installing dependencies such as express, body parser, Redis, and method override for the Node.js Express app setup.', 'Setting up view engine The process of setting up the view engine using Express Handlebars for the Node.js Express app is explained.', 'Configuring standard middleware The configuration of standard middleware like body parser and method override for the Node.js Express app is demonstrated.']}], 'duration': 333.224, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA65426.jpg', 'highlights': ['Dependencies installation The chapter covers installing dependencies such as express, body parser, Redis, and method override for the Node.js Express app setup.', "Configuring a start script in the package.json file to run the application using 'npm start'.", "Generating a package.json file using npm init with details like description, entry point, and author's name.", 'Setting up view engine The process of setting up the view engine using Express Handlebars for the Node.js Express app is explained.', 'Configuring standard middleware The configuration of standard middleware like body parser and method override for the Node.js Express app is demonstrated.', "The process involves creating a new directory for the project, named 'redusers'.", 'The importance of having Node.js installed for the setup process.']}, {'end': 695.316, 'segs': [{'end': 520.573, 'src': 'embed', 'start': 398.69, 'weight': 0, 'content': [{'end': 406.053, 'text': "This is the parameter we need to use when we're making our requests so that we can make a delete request with a form.", 'start': 398.69, 'duration': 7.363}, {'end': 410.495, 'text': 'Okay, so that should do it for the module middleware.', 'start': 407.574, 'duration': 2.921}, {'end': 414.737, 'text': "Now we're going to create our route to the home page.", 'start': 411.396, 'duration': 3.341}, {'end': 419.299, 'text': "So app dot, it's going to be a get request to slash.", 'start': 416.158, 'duration': 3.141}, {'end': 426.995, 'text': 'And then we want to run a function, which is going to take in the request, the response, and next.', 'start': 420.874, 'duration': 6.121}, {'end': 430.896, 'text': 'And then we just want to load a template.', 'start': 427.736, 'duration': 3.16}, {'end': 433.017, 'text': 'So we can say res.render.', 'start': 431.156, 'duration': 1.861}, {'end': 437.858, 'text': 'And the home page is going to render a template called search users.', 'start': 434.337, 'duration': 3.521}, {'end': 441.919, 'text': 'Then we just need to listen on our port.', 'start': 439.658, 'duration': 2.261}, {'end': 446.583, 'text': "So we're going to pass in the port number, which we defined above.", 'start': 443.621, 'duration': 2.962}, {'end': 450.525, 'text': "And then we'll have a function run when we're connected.", 'start': 446.783, 'duration': 3.742}, {'end': 454.247, 'text': "And we're just going to console.log.", 'start': 451.466, 'duration': 2.781}, {'end': 458.95, 'text': "And we'll say server started on port.", 'start': 455.628, 'duration': 3.322}, {'end': 461.572, 'text': "And then we'll just concatenate that port number.", 'start': 459.391, 'duration': 2.181}, {'end': 463.793, 'text': "All right, so let's save that.", 'start': 462.392, 'duration': 1.401}, {'end': 466.475, 'text': "And then we're going to create a views folder.", 'start': 464.634, 'duration': 1.841}, {'end': 471.458, 'text': "And in here, we're going to create a layouts folder.", 'start': 469.156, 'duration': 2.302}, {'end': 477.327, 'text': "And in the layouts, we're going to create a file called main dot handlebars.", 'start': 473.366, 'duration': 3.961}, {'end': 480.588, 'text': 'Okay, and this is going to be our main layout.', 'start': 478.828, 'duration': 1.76}, {'end': 488.071, 'text': "So let's put some HTML in here and let's say red users management.", 'start': 480.628, 'duration': 7.443}, {'end': 491.252, 'text': "And we're going to use bootstrap.", 'start': 489.891, 'duration': 1.361}, {'end': 494.513, 'text': "I'm actually going to use boot swatch, which is just a custom version.", 'start': 491.272, 'duration': 3.241}, {'end': 502.015, 'text': "So let's see, we're going to grab one of these themes.", 'start': 497.153, 'duration': 4.862}, {'end': 505.662, 'text': 'You can use whatever you want.', 'start': 504.301, 'duration': 1.361}, {'end': 508.344, 'text': "I'm going to use this flatly and click download.", 'start': 505.682, 'duration': 2.662}, {'end': 511.146, 'text': "And then I'm just going to copy the CSS link up here.", 'start': 508.504, 'duration': 2.642}, {'end': 513.288, 'text': "And then we'll put that over here.", 'start': 511.767, 'duration': 1.521}, {'end': 520.573, 'text': "Style sheet, href, and let's paste that in.", 'start': 516.39, 'duration': 4.183}], 'summary': 'Creating a route to the home page, rendering a template, and listening on a defined port.', 'duration': 121.883, 'max_score': 398.69, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA398690.jpg'}], 'start': 398.69, 'title': 'Creating routes and search users view', 'summary': 'Covers creating routes using express.js, rendering templates, linking css files, and setting up search users view with a navigation bar, starter template from getbootstrap.com, and a search form to search users by their id.', 'chapters': [{'end': 542.23, 'start': 398.69, 'title': 'Creating route to home page', 'summary': 'Covers creating a route to the home page using express.js, setting up middleware, rendering a template, and linking a css file, in addition to listening on a specific port.', 'duration': 143.54, 'highlights': ['Setting up middleware to handle delete requests with a form.', 'Creating a route to the home page using Express.js and rendering a template called search users.', 'Linking a CSS file and setting up the main layout using Express Handlebars syntax.']}, {'end': 695.316, 'start': 542.85, 'title': 'Creating search users view', 'summary': 'Covers setting up the search users view with a navigation bar, implementing a starter template from getbootstrap.com, and creating a search form to search users by their id.', 'duration': 152.466, 'highlights': ['Setting up the search users view with a navigation bar The chapter covers creating a navigation bar using a starter template from getbootstrap.com for the search users view.', 'Implementing a starter template from getbootstrap.com The chapter details the process of implementing a starter template from getbootstrap.com to create a navigation bar for the search users view.', 'Creating a search form to search users by their ID The chapter discusses the creation of a search form to search users by their ID, allowing for efficient user search functionality.']}], 'duration': 296.626, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA398690.jpg', 'highlights': ['Creating a route to the home page using Express.js and rendering a template called search users.', 'Creating a search form to search users by their ID.', 'Linking a CSS file and setting up the main layout using Express Handlebars syntax.', 'Setting up the search users view with a navigation bar using a starter template from getbootstrap.com.']}, {'end': 1094.689, 'segs': [{'end': 729.551, 'src': 'embed', 'start': 696.216, 'weight': 0, 'content': [{'end': 702.718, 'text': "So let's go into search users dot handlebars, which is right here.", 'start': 696.216, 'duration': 6.502}, {'end': 704.751, 'text': 'All right.', 'start': 704.411, 'duration': 0.34}, {'end': 707.292, 'text': "And let's see what I want to do here.", 'start': 705.171, 'duration': 2.121}, {'end': 708.672, 'text': "Let's put an H1.", 'start': 707.372, 'duration': 1.3}, {'end': 711.833, 'text': "We'll just say search users.", 'start': 710.233, 'duration': 1.6}, {'end': 715.014, 'text': "And let's see.", 'start': 714.254, 'duration': 0.76}, {'end': 718.035, 'text': "We're going to put a form.", 'start': 715.054, 'duration': 2.981}, {'end': 721.276, 'text': "I'm going to give it a class of form inline.", 'start': 718.055, 'duration': 3.221}, {'end': 724.306, 'text': 'which is a bootstrap class.', 'start': 722.864, 'duration': 1.442}, {'end': 729.551, 'text': "And we're going to give this a method of post because we're making a post request.", 'start': 725.106, 'duration': 4.445}], 'summary': 'Creating a search users page with an h1 header and a form using bootstrap class form inline. the form has a method of post.', 'duration': 33.335, 'max_score': 696.216, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA696216.jpg'}, {'end': 929.931, 'src': 'heatmap', 'start': 883.976, 'weight': 1, 'content': [{'end': 892.883, 'text': "And then we're just going to take that client and we're going to say dot on and we want to say dot on connect.", 'start': 883.976, 'duration': 8.907}, {'end': 900.889, 'text': "OK, so when we connect to Redis, we're going to run this function and let's just do a console dot log.", 'start': 893.443, 'duration': 7.446}, {'end': 908.575, 'text': "and we'll say connected to Redis.", 'start': 902.771, 'duration': 5.804}, {'end': 913.899, 'text': "All right, so let's just save that and make sure that that works.", 'start': 911.177, 'duration': 2.722}, {'end': 918.603, 'text': 'So if we reload the server, now you see we have connected to Redis.', 'start': 913.959, 'duration': 4.644}, {'end': 922.826, 'text': 'Okay, so we can now use that client to run commands.', 'start': 919.343, 'duration': 3.483}, {'end': 929.931, 'text': "Now, when we submit this, we're going to run a command called hgetall.", 'start': 924.387, 'duration': 5.544}], 'summary': 'Using client to connect to redis and run hgetall command.', 'duration': 34.627, 'max_score': 883.976, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA883976.jpg'}], 'start': 696.216, 'title': 'Building user search form and rendering search users', 'summary': 'Demonstrates building a user search form with bootstrap classes, handling a post request to /user/search, creating and connecting to a redis client, using the client to run commands like hgetall, and re-rendering the search form if the object is not found. it also covers rendering search users, passing along an error message, rendering details for found users, creating a details page, and implementing error display in the search users template.', 'chapters': [{'end': 978.552, 'start': 696.216, 'title': 'Building user search form', 'summary': 'Demonstrates building a user search form with bootstrap classes, handling a post request to /user/search, creating and connecting to a redis client, and using the client to run commands like hgetall, with a demonstration of re-rendering the search form if the object is not found.', 'duration': 282.336, 'highlights': ['Creating a user search form with Bootstrap classes and handling a post request to /user/search.', 'Demonstrating the creation of a Redis client and connecting to Redis, with a console log confirming the connection.', 'Using the Redis client to run the hgetall command, which returns all fields and values of a hash stored at a certain key or an ID, and checking for the presence of the object and re-rendering the search form if not found.']}, {'end': 1094.689, 'start': 980.274, 'title': 'Rendering search users and handling errors', 'summary': 'Covers rendering search users, passing along an error message, and rendering details for found users, with a mention of creating a details page and implementing error display in the search users template.', 'duration': 114.415, 'highlights': ['Rendering search users and passing along an error message if the user does not exist.', 'Assigning an ID property and rendering details page for found users.', 'Implementing error display in the search users template by using an if statement and span element.']}], 'duration': 398.473, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA696216.jpg', 'highlights': ['Creating a user search form with Bootstrap classes and handling a post request to /user/search.', 'Demonstrating the creation of a Redis client and connecting to Redis, with a console log confirming the connection.', 'Using the Redis client to run the hgetall command, which returns all fields and values of a hash stored at a certain key or an ID, and checking for the presence of the object and re-rendering the search form if not found.', 'Rendering search users and passing along an error message if the user does not exist.', 'Assigning an ID property and rendering details page for found users.', 'Implementing error display in the search users template by using an if statement and span element.']}, {'end': 1344.543, 'segs': [{'end': 1127.988, 'src': 'embed', 'start': 1094.689, 'weight': 1, 'content': [{'end': 1111.462, 'text': "so let's create that view details, dot handlebars and let's see in here we're gonna put in h1 and I want to put the user's first name and last name.", 'start': 1094.689, 'duration': 16.773}, {'end': 1126.547, 'text': "so we should be able to say user dot first name, user dot last name and then let's put the id in a set of brackets.", 'start': 1111.462, 'duration': 15.085}, {'end': 1127.988, 'text': "okay, so that'll be the h1.", 'start': 1126.547, 'duration': 1.441}], 'summary': "Creating a view with user's first and last name and id.", 'duration': 33.299, 'max_score': 1094.689, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1094689.jpg'}, {'end': 1344.543, 'src': 'embed', 'start': 1263.192, 'weight': 0, 'content': [{'end': 1266.593, 'text': "So I'm just going to change this stuff up.", 'start': 1263.192, 'duration': 3.401}, {'end': 1273.354, 'text': "We'll say this is Tom Smith.", 'start': 1271.294, 'duration': 2.06}, {'end': 1278.135, 'text': 'Last name Smith.', 'start': 1277.055, 'duration': 1.08}, {'end': 1282.416, 'text': 'And Tom.', 'start': 1281.796, 'duration': 0.62}, {'end': 1284.676, 'text': 'OK, so now we have two users.', 'start': 1283.196, 'duration': 1.48}, {'end': 1287.417, 'text': "So let's start our application back up.", 'start': 1284.736, 'duration': 2.681}, {'end': 1291.441, 'text': 'We got to get out of Redis first.', 'start': 1290.141, 'duration': 1.3}, {'end': 1295.982, 'text': 'Control C.', 'start': 1291.841, 'duration': 4.141}, {'end': 1296.282, 'text': 'All right.', 'start': 1295.982, 'duration': 0.3}, {'end': 1303.764, 'text': "So let's go back to our app and let's go ahead and search for user 001.", 'start': 1296.322, 'duration': 7.442}, {'end': 1308.124, 'text': "Oh, you know what? I didn't change the ID for the other one.", 'start': 1303.764, 'duration': 4.36}, {'end': 1315.066, 'text': 'So so Tom overwrote John, but you can see it is working.', 'start': 1309.485, 'duration': 5.581}, {'end': 1317.266, 'text': 'I actually want to put a class on these allies, though.', 'start': 1315.106, 'duration': 2.16}, {'end': 1330.473, 'text': 'so this is going to be list group item.', 'start': 1319.685, 'duration': 10.788}, {'end': 1332.574, 'text': 'here we go all right.', 'start': 1330.473, 'duration': 2.101}, {'end': 1335.777, 'text': 'so so we have one user of tom smith.', 'start': 1332.574, 'duration': 3.203}, {'end': 1340.18, 'text': "so we're going to now add the functionality to create a user through the application.", 'start': 1335.777, 'duration': 4.403}, {'end': 1344.543, 'text': "all right, because we don't want to keep having to use the redis cli.", 'start': 1340.18, 'duration': 4.363}], 'summary': 'Developed functionality for creating user through application, one user added', 'duration': 81.351, 'max_score': 1263.192, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1263192.jpg'}], 'start': 1094.689, 'title': 'User details and functionality', 'summary': 'Covers creating a user details view with user information and implementing user functionality in the application to streamline user management and reduce reliance on redis cli.', 'chapters': [{'end': 1263.172, 'start': 1094.689, 'title': 'Creating user details view', 'summary': "Outlines creating a user details view with a header displaying the user's first name, last name, email, and phone number, followed by a list of users populated using redis cli commands.", 'duration': 168.483, 'highlights': ["Creating user details view with first name, last name, email, and phone number The view details are created with an h1 header displaying the user's first name, last name, and their id, followed by a ul list containing email, phone number, and a back button.", 'Adding users to the database using Redis CLI Users are added to the database using the HMSet command in Redis CLI, enabling the addition of user details such as first name, last name, email, and phone number.']}, {'end': 1344.543, 'start': 1263.192, 'title': 'Implementing user functionality in application', 'summary': 'Details the process of adding user functionality to the application, including creating users, changing user ids, and using class attributes, aiming to streamline user management and reduce reliance on redis cli.', 'duration': 81.351, 'highlights': ['The chapter demonstrates the process of adding a user functionality to the application, involving creating and modifying user data, aiming to improve user management and experience.', "Implementing a class attribute 'list group item' to enhance the user interface is discussed, contributing to a more visually intuitive and user-friendly application.", 'The need to reduce reliance on the redis cli for user management is emphasized, indicating a shift towards a more efficient and streamlined user management process.']}], 'duration': 249.854, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1094689.jpg', 'highlights': ['Creating user details view with first name, last name, email, and phone number', 'Adding users to the database using Redis CLI', "Implementing a class attribute 'list group item' to enhance the user interface", 'The chapter demonstrates the process of adding a user functionality to the application', 'The need to reduce reliance on the redis cli for user management is emphasized']}, {'end': 2050.71, 'segs': [{'end': 1497.568, 'src': 'embed', 'start': 1441.363, 'weight': 0, 'content': [{'end': 1446.188, 'text': "Placeholder And then we'll have email.", 'start': 1441.363, 'duration': 4.825}, {'end': 1453.935, 'text': 'Change the name to email.', 'start': 1452.614, 'duration': 1.321}, {'end': 1456.218, 'text': 'And then phone.', 'start': 1453.955, 'duration': 2.263}, {'end': 1466.374, 'text': 'okay, now we have our submit.', 'start': 1464.833, 'duration': 1.541}, {'end': 1468.516, 'text': "let's change the search.", 'start': 1466.374, 'duration': 2.142}, {'end': 1473.46, 'text': 'change that to save.', 'start': 1468.516, 'duration': 4.944}, {'end': 1478.644, 'text': 'alright, save that, and then we need to add a route so that we can show the form.', 'start': 1473.46, 'duration': 5.184}, {'end': 1487.05, 'text': "so let's go back to app.js and we'll just copy this.", 'start': 1478.644, 'duration': 8.406}, {'end': 1494.867, 'text': 'paste that in and this is going to be add user page and this will be slash.', 'start': 1487.05, 'duration': 7.817}, {'end': 1497.568, 'text': 'user slash add.', 'start': 1494.867, 'duration': 2.701}], 'summary': 'Changing names, adding routes, and updating functionality for a user form.', 'duration': 56.205, 'max_score': 1441.363, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1441363.jpg'}, {'end': 1573.636, 'src': 'embed', 'start': 1535.692, 'weight': 3, 'content': [{'end': 1540.974, 'text': 'Now this is going to be posted to slash user slash add.', 'start': 1535.692, 'duration': 5.282}, {'end': 1542.954, 'text': "So let's go back to app.js.", 'start': 1541.414, 'duration': 1.54}, {'end': 1545.195, 'text': "And we're just going to copy this.", 'start': 1543.855, 'duration': 1.34}, {'end': 1554.245, 'text': "And let's say process add user page.", 'start': 1547.902, 'duration': 6.343}, {'end': 1558.308, 'text': "So we want to change this to a post because it's a post request.", 'start': 1554.666, 'duration': 3.642}, {'end': 1560.829, 'text': 'Get rid of that.', 'start': 1560.149, 'duration': 0.68}, {'end': 1564.551, 'text': 'And then we want to grab all the form fields.', 'start': 1560.849, 'duration': 3.702}, {'end': 1566.652, 'text': "So let's create variables for those.", 'start': 1564.651, 'duration': 2.001}, {'end': 1573.636, 'text': "Request.body.id And then we'll just copy this.", 'start': 1568.073, 'duration': 5.563}], 'summary': 'Updating app.js to handle post request, grabbing form fields', 'duration': 37.944, 'max_score': 1535.692, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1535692.jpg'}, {'end': 1869.634, 'src': 'embed', 'start': 1831.422, 'weight': 4, 'content': [{'end': 1835.343, 'text': "And then we're going to put a form here.", 'start': 1831.422, 'duration': 3.921}, {'end': 1842.945, 'text': "So let's say form and give this a method of post, but it's actually going to be a delete.", 'start': 1837.143, 'duration': 5.802}, {'end': 1856.71, 'text': 'And the action, The action is going to be slash user slash delete slash, and then we need to put the user ID.', 'start': 1844.546, 'duration': 12.164}, {'end': 1864.132, 'text': 'Okay, now in order to use method override, we need to add a parameter here.', 'start': 1856.73, 'duration': 7.402}, {'end': 1869.634, 'text': "So we're going to put a question mark underscore method and set that to delete.", 'start': 1864.172, 'duration': 5.462}], 'summary': 'Setting up a form with method override to delete user data.', 'duration': 38.212, 'max_score': 1831.422, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1831422.jpg'}, {'end': 1954.606, 'src': 'embed', 'start': 1910.063, 'weight': 1, 'content': [{'end': 1913.144, 'text': 'so the text on the button is going to say delete.', 'start': 1910.063, 'duration': 3.081}, {'end': 1917.025, 'text': "All right, let's save that and let's reload this.", 'start': 1914.484, 'duration': 2.541}, {'end': 1921.346, 'text': 'Okay, so now we have a delete.', 'start': 1917.045, 'duration': 4.301}, {'end': 1922.847, 'text': "Now I'm going to click that.", 'start': 1921.906, 'duration': 0.941}, {'end': 1926.868, 'text': "Oh, we didn't add the route.", 'start': 1924.447, 'duration': 2.421}, {'end': 1929.949, 'text': 'So we need to go to app.js and add that route.', 'start': 1927.528, 'duration': 2.421}, {'end': 1933.71, 'text': 'Getting a little ahead of myself.', 'start': 1932.389, 'duration': 1.321}, {'end': 1938.463, 'text': 'All right, so we can say app.delete.', 'start': 1935.683, 'duration': 2.78}, {'end': 1948.345, 'text': "And that's going to be slash user slash delete slash colon ID.", 'start': 1942.364, 'duration': 5.981}, {'end': 1954.606, 'text': 'This will be request.', 'start': 1948.365, 'duration': 6.241}], 'summary': 'Adding a delete button functionality and route in app.js for user deletion.', 'duration': 44.543, 'max_score': 1910.063, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1910063.jpg'}, {'end': 2050.71, 'src': 'embed', 'start': 2029.617, 'weight': 2, 'content': [{'end': 2030.838, 'text': "And the user doesn't exist.", 'start': 2029.617, 'duration': 1.221}, {'end': 2034.191, 'text': "Okay, so I think that's going to be it, guys.", 'start': 2032.048, 'duration': 2.143}, {'end': 2042.24, 'text': 'This is a really simple application, but it shows you how to get started with Node.js and Redis, working with them both together.', 'start': 2034.211, 'duration': 8.029}, {'end': 2044.002, 'text': 'Hopefully you enjoyed this.', 'start': 2042.981, 'duration': 1.021}, {'end': 2049.748, 'text': "If you like this video, please subscribe, please leave it a like, and that's it.", 'start': 2044.302, 'duration': 5.446}, {'end': 2050.71, 'text': 'I will see you next time.', 'start': 2049.869, 'duration': 0.841}], 'summary': 'Intro to node.js and redis for a simple application.', 'duration': 21.093, 'max_score': 2029.617, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA2029617.jpg'}], 'start': 1344.543, 'title': 'User management in node.js', 'summary': "Involves creating an 'add user' view and form with fields for first name, last name, email, and phone, adding a route to display the form, and demonstrating the process of adding and deleting users in a node.js and redis application, offering an efficient way to work with node.js and redis.", 'chapters': [{'end': 1534.572, 'start': 1344.543, 'title': 'Creating add user view', 'summary': "Involves creating a new 'add user' view and form in the app, including fields for first name, last name, email, and phone, and adding a route to display the form, followed by a server restart and form check.", 'duration': 190.029, 'highlights': ["Creating a new 'add user' view and form with fields for first name, last name, email, and phone", 'Adding a route to display the add user form in the app', 'Removing the inline class to adjust the appearance of the add user form', 'Restarting the server to apply the changes']}, {'end': 2050.71, 'start': 1535.692, 'title': 'Implementing user addition and deletion', 'summary': 'Demonstrates the process of adding and deleting users in a node.js and redis application, including handling post requests, setting form variables, using redis commands, implementing user deletion with method override, and redirecting users to the homepage; showcasing an efficient way to work with node.js and redis.', 'duration': 515.018, 'highlights': ['The chapter demonstrates the process of adding and deleting users in a Node.js and Redis application The chapter focuses on demonstrating the process of adding and deleting users in a Node.js and Redis application.', 'including handling post requests, setting form variables, using Redis commands The process involves handling post requests, setting form variables for first name, last name, email, and phone, and utilizing Redis commands like HM set for efficient user addition.', 'implementing user deletion with method override, and redirecting users to the homepage The method override is used to implement user deletion via a form with a delete button, and upon deletion, users are redirected to the homepage, showcasing an efficient way to handle user deletion.', 'showcasing an efficient way to work with Node.js and Redis The chapter demonstrates an efficient way to work with Node.js and Redis, providing a practical guide for handling user addition and deletion in an application.']}], 'duration': 706.167, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/9S-mphgE5fA/pics/9S-mphgE5fA1344543.jpg', 'highlights': ["Creating a new 'add user' view and form with fields for first name, last name, email, and phone", 'Adding a route to display the add user form in the app', 'The chapter demonstrates the process of adding and deleting users in a Node.js and Redis application', 'The process involves handling post requests, setting form variables for first name, last name, email, and phone, and utilizing Redis commands like HM set for efficient user addition', 'The method override is used to implement user deletion via a form with a delete button, and upon deletion, users are redirected to the homepage, showcasing an efficient way to handle user deletion', 'The chapter demonstrates an efficient way to work with Node.js and Redis, providing a practical guide for handling user addition and deletion in an application']}], 'highlights': ["The tutorial series 'build a node.js & redis app from scratch' includes chapters on creating a user management app with node.js, express, and redis, offering a comprehensive guide with practical instructions for linux, mac, and windows users.", 'The video demonstrates creating a user management application using node.js, express, and redis, emphasizing the importance of watching the preceding redis crash course for better understanding.', 'Instructions are provided on how to install redis for Linux using apt-get, and for Mac and Windows through the redis.io website, including a specific guide for Windows users.', 'Dependencies installation The chapter covers installing dependencies such as express, body parser, Redis, and method override for the Node.js Express app setup.', "Configuring a start script in the package.json file to run the application using 'npm start'.", 'Creating a route to the home page using Express.js and rendering a template called search users.', 'Creating a user search form with Bootstrap classes and handling a post request to /user/search.', 'Creating user details view with first name, last name, email, and phone number', "Creating a new 'add user' view and form with fields for first name, last name, email, and phone", 'The chapter demonstrates the process of adding and deleting users in a Node.js and Redis application']}