Placeholder Image

Subtitles section Play video

  • [DING]

  • Welcome back.

  • It is time for Module 2.

  • And in this module, I'm going to do something

  • quite exciting and quite different

  • than what I've done so far.

  • Everything that I did in the previous example,

  • it was all client-side JavaScript--

  • drawing the map, graphing the global temperature data,

  • loading images and displaying them

  • on the web page with the fetch function, all of that

  • was done with client-side JavaScript,

  • meaning JavaScript written into the HTML page itself.

  • But there are a lot of things that you, that I,

  • that the people of the world who were doing this programming

  • thing want to do, working with data and APIs,

  • that you cannot do with client-side JavaScript only.

  • So in this module, I'm going to show

  • you server-side programming.

  • And I'm going to use a JavaScript runtime called

  • Node.js which can be used for server-side programming.

  • Now, the details of what server-side programming is,

  • and how I'm going to do it, that's to come.

  • But this project that I'm going to build,

  • the fundamental thing, the reason why

  • we need node for this project is for data persistence.

  • I want to gather some data, and save it, and get it back later.

  • And this is not something that you can easily

  • do without writing a server.

  • You could certainly use somebody else's server.

  • There's something called database

  • as a service, where I could just be like, hey, you've

  • got a server, can I sign up for you?

  • And take my data, and then I'll ask for it back later.

  • But I'm actually going to create a server that's

  • going to run on this laptop here,

  • and I'm in a save the date data here.

  • Now, at some point, I'm also going

  • to need to show you how to get that server

  • to run somewhere else besides your own laptop,

  • but that's a place to start.

  • The project that I'm going to build in this module

  • is called the Data Selfie App.

  • And the Data Selfie App is an example project

  • by Joey Lee who's designer and researcher.

  • He teaches a class right here at NYU at ITP

  • called Quant Humanists.

  • It's about data and self tracking.

  • And so Joey has graciously given permission

  • to use, to build on top of his examples,

  • as part of this series.

  • In this video's description I'll link to Joey's website

  • so you can learn more about his work,

  • as well as to the original GitHub repo for the data selfie

  • app so you can find all of the code for the things

  • that I'm going to show you.

  • Now, in order follow along with the code

  • that I'm going to write and demonstrate

  • as I build this project, you're going

  • to need to download and install some stuff that you might not

  • have on your computer already.

  • It's going to be confusing, because you might

  • be using Windows, or you might be using Mac,

  • and I'm using a Mac.

  • And oi, what are we going to solve this?

  • All right.

  • So let me give you a list of the things you need

  • and help you with some resources to find those things.

  • Number 1, you need to install Node.js.

  • That should be as easy as going to nodejs.org and following

  • the installation instructions for your operating system.

  • I do also have an entire video about downloading

  • and installing node, and what note

  • is, that I'll also link you to if you

  • want more background there.

  • You're also going to want some kind of console application,

  • some command-line terminal thing that you can open up

  • and type commands in to run Node stuff on your computer.

  • I'm using iTerm, which is an alternative to the Mac's

  • built in terminal application.

  • On Windows I hear people like PowerShell,

  • just the built-in command thing--

  • oh, and Git BASH.

  • Git BASH is possibly a good one too.

  • I actually have a whole workflow series

  • where I go through all of these bits and pieces of everything

  • you need to have your environment set up

  • to follow along with what I'm doing.

  • So you can also just go and find that series,

  • watch that, and come back here.

  • But all you need is download Node,

  • you need some kind of shell command prompt thing,

  • and you need a code editor.

  • If you've got that, you're ready to go.

  • So before I get to coding and building the actual project,

  • let's just talk for a second about, what is Node?

  • Now, if you go to the Node website, it says right there,

  • Node.js is a JavaScript runtime built on Chrome's V8 JavaScript

  • engine.

  • That is a mouthful.

  • Let's try to understand what that is.

  • What do I mean by runtime?

  • So normally, when I'm typing JavaScript,

  • I'm exevuting that stuff in the browser.

  • The JavaScript has no meaning without the browser itself.

  • Suddenly, with Node, I can start to write JavaScript

  • without the browser.

  • It's its own runtime.

  • The code runs on your computer.

  • Let's look at what that means more practically speaking.

  • So here I am with my command-line access

  • where I can type in commands.

  • So hopefully you're here.

  • You've downloaded your terminal app thingy,

  • you've got it going, and you've installed Node.

  • If I now type in n-o-d-e, node, and hit Enter,

  • suddenly I have entered the JavaScript runtime.

  • This is very similar to the developers

  • console in the browser.

  • But here, I can start typing in some JavaScript stuff,

  • like const x = 5, and then I could say x + 2,

  • and it's going to give me the number 7.

  • So we can see this is a runtime--

  • a place where I can write JavaScript and run JavaScript.

  • Now, this is not typically how you would use Node.

  • Typically, I wouldn't just be writing

  • a lot of code line-by-line in my terminal itself.

  • I would write a bunch of JavaScript code

  • in a JavaScript file, then execute it

  • through a Node command.

  • So let's see how that works.

  • So I actually have a file called index.js.

  • It's just a JavaScript file.

  • And I could put something in like console.log('hello');.

  • And I could say const x = 5.

  • And I could say something like console.log(x + 2);,

  • and let's see what happens.

  • So now, if I go back to the terminal,

  • I can type node index.js.

  • And this is me saying, hey, execute the code line-by-line,

  • in the order that it's written, of what you find in that file.

  • So I'm going to do that right now.

  • And there we go.

  • So what is it that I want to write and that index.js file.

  • Clearly, console logging a bunch of things,

  • I can see that it works.

  • But why am I using Node?

  • The reason why I'm using Node is that I want to create a server.

  • A server is an application that runs and listens.

  • And what it listens for is it listens

  • for requests-- people who want to connect to that server.

  • So this server is going to be the central repository

  • of the data of my application.

  • All of the different clients, whether it's you on your phone,

  • or so-and-so on their laptop, or somebody else

  • on their internet connected toaster,

  • can make a request to the server and grab some data.

  • So I could come back over here and just start writing--

  • I could Google "write a web server with Node.js,"

  • and I could find some code, and I could start typing in there,

  • and I could create that server.

  • It's going to open up a connection and start listening.

  • However, one of the ways that is very typical when

  • working with Node is to find a pacakge--

  • a Node package-- that has some of the functionality

  • you're looking for, install that package--

  • it's like a library or an add-on--

  • and make use of that functionality.

  • And the Node package that I want to use to create my web server

  • is something called Express.

  • Express is a pretty minimal and very simple

  • framework for making web servers.

  • And it has the core functionality

  • you need without a lot of bells and whistles.

  • So we can kind of get up and running with it really quickly.

  • So now, we have a node.

  • We can write JavaScript code in a thing and run it with Node.

  • So in theory, we could write some JavaScript

  • code to make a server, but we didn't need this package.

  • How do we have access to the Node package

  • Express in our Node code?

  • NPM stands for Node Package Manager,

  • and it's the thing that manages all of our Node packages

  • for us.

  • You don't have to install that.

  • In fact, when you installed Node, you also installed NPM--

  • Node Package Manager.

  • If I want to use NPM with this project, I need package.json.

  • The good news for you is that dot. json in package.json.

  • You know what json is, because we've worked with it.

  • We have gotten data in JSON format--

  • JavaScript Object Notation, before in previous examples.

  • package.json is a special kind of file.

  • It's basically the configuration file for your project.

  • This is where all the meta information about our project--

  • what Node packages we're using, what our project is called--

  • and by project, I mean web application-- all of that's

  • going to be in package.json.

  • To create the package.json file, I could, if I want,

  • just make a file called package.json and type

  • some stuff into it.

  • But if I want to not make any mistakes, if I want to be sure,

  • there's a nice command-line utility from NPM itself

  • that will generate the file for me.

  • And that is npm init.

  • So as long as I've got Node installed,

  • if I'm in the project directory I can type npm in it,

  • and it's going to walk me through what

  • I need in the Package.json not

  • So one thing is I need a name.

  • It's guessing, because the folder's called module2,

  • module two, that sounds good.

  • I'll just hit Enter.

  • Version number-- I'm not going to worry about the version

  • number.

  • This is important if I'm building an open source library

  • and I need to really keep track of version numbers.

  • But I'm just kind of tinkering around here.

  • Description-- let me add something.

  • This is the Data Selfie App by Joey Lee.

  • Entry point, index.js-- Yes that's

  • the file that I want to put my code in that I want to run when

  • I want to run this project.

  • Test command-- I'm not worrying about testing right now.

  • I'll refer you to some other videos about that

  • if you're interested.

  • Gut repository-- I'm not worrying about that.

  • Keywords-- example, data selfie, something like that.

  • I think I could give some keywords separated by commas.

  • Author-- this is a tricky one, because I'm basing my work

  • off of Joey's work.

  • I'll put my name in there for right now,

  • and I'll make sure that everything is well documented

  • of where it's coming from as I go.

  • License-- I'm going to put in MIT.

  • That's a very permissive license.

  • It basically lets you do just about anything

  • you want with the code.

  • I'm using the same license that Joey is using.

  • And then, look at this, it's giving me--

  • this is the information that is going in that package.json

  • file.

  • Does it look OK to me?

  • It does, I'm going to type yes.

  • So if I go back to my code editor, I can see.

  • There we go.

  • Here's that package.json file.

  • All the information that's needed is in there.

  • It's formatted correctly.

  • I'm ready to go.

  • But I'm not ready to go, right?

  • The reason I was doing this in the first place

  • is that I'm trying to get to the point

  • where I can install the Node package Express, the web

  • framework I want to use for creating my server.

  • The reason why I need this package.json

  • file is in this file is where I need

  • to make reference to Express.

  • I need to say Express is a package that I'm

  • using for my project.

  • But I don't want to edit this file directly,

  • even though I could.

  • What I want to do, instead, is say npm install express.

  • Say npm install express, and run that.

  • Once, I've run this, two things are going to happen.

  • Number one is we're going to see Express pop-up in package.json

  • as one of the dependencies.

  • It is a dependency of this project.

  • My project depends on the existence of the Express Node

  • package, which I intend to use quite a bit in this code.

  • The other thing that's happened is

  • I have a new folder called node_modules.

  • And when I look into this folder,

  • oh, my God, there's so much stuff in here.

  • So this is the thing-- oh, look, there's express.

  • I only said express.

  • NPM installed express.

  • I didn't say inherits or fresh or http-errors.

  • It is so happens that most Node packages depend

  • on other packages, and the Node Package Manager

  • is smart enough to know that if I'm saying install express,

  • it's going to go grab everything else that it needs as well.

  • So the nice thing is we don't have to manage that folder.

  • Everything that we need will be in there.

  • But don't be freaked out if you see

  • all sorts of other things in there that you do

  • think that you installed.

  • They're coming along for the ride with Express itself.

  • I'm finally ready to write some code.

  • So in order to have access to the express package, the Node

  • package Express, I need to use require.

  • So I can say const express = require('express').

  • This is basically like an import statement.

  • Hey, you know that Node package I installed called Express?

  • Give me that thing, and put it all in this variable called

  • express.

  • The reason why I want to do that is I

  • want to create a web application.

  • I'm going to call it app.

  • And the way I'm going to create that is just

  • call the express function.

  • So that whole library, the whole Node package Express,

  • basically comes in as a big function

  • that I can just execute and put in a variable.

  • The first thing that I want to do in a web server,

  • if I think back to my silly little diagram--

  • here's the web server, it's listening, listening,

  • anybody want to connect to me-- is I need to start listening.

  • So now, I can listen.

  • I could just actually say app.listen().

  • And when I want to start listening,

  • I need to also specify something known as a port.

  • Look at this, it's even telling me right here

  • in Node what I need.

  • The port is a unique number.

  • It's like a numeric address at which I'm going to listen.

  • So you could have different servers running

  • different ports, and there are specific ports

  • reserved for certain things.

  • But that's beyond the scope of what I'm doing right here.

  • I'm just going to pick some port that I

  • know won't be used by something else, like 3,000,

  • and then I'm going to give a callback function here which

  • basically is just the callback that happen

  • once the server is listening.

  • So I'll use my arrow syntax and just say

  • console.log to say listening at 3,000.

  • There are nicer ways I could clean this up,

  • but this is the idea--

  • require Express, create the app, and listen at a port.

  • And there we go.

  • I'm listening.

  • I could connect.

  • Should we connect?

  • So I'd be very happy to accept connections at port 3,000

  • right now, but I need to figure out why am I here,

  • what am I listening for, what kind of information

  • an I going to send back.

  • So let's make a list of some of the things

  • I want the server to do.

  • And it's pretty simple for this app.

  • Number 1, I want to serve web pages.

  • In other words, right now I'm just a server

  • running locally on this laptop at port 3,000,

  • but if I were to deploy my server to my website thingy

  • url.com, and people type that address into their browser,

  • I want to send them the HTML and JavaScript and CSS

  • and all that stuff that I have made for them to be

  • able to see in their browser.

  • So to simplify that let's just serve one page index.html.

  • So when I open up my web browser or whatever content

  • is in there, I should see.

  • So that's number one.

  • There's other things that I want to do, of course, like I

  • want to receive information and save it in the database.

  • And then I want to be to send information from the database

  • back out.

  • But I'm going to get to that stuff as I go further

  • and build this project.

  • Let's actually just finish off this first part

  • by serving a web page.

  • So these are all the files I have already.

  • I have package.json.

  • We know about that.

  • That's the configuration of my project.

  • index.js, that's my server code.

  • It gets confusing, because I'm going to have

  • server code and client code.

  • We got to keep this stuff straight.

  • I have node_modules.

  • That's all of the stuff all the Node packages

  • that I've installed.

  • I don't need to look in there.

  • There's also this package-lock file.

  • It's kind of an important file.

  • It's auto-generated.

  • You don't need to touch it.

  • But it's basically keeping track of the dependencies

  • and versions of your packages.

  • We can leave that aside.

  • index.html-- that's the file that I want to see when I go

  • and try to make a connection.

  • Right now, if I go to the browser

  • and try to access local host, that's

  • my server running locally on this computer at port 3,000,

  • I should see whatever the server has and is able to give to me.

  • So I hit Enter, and it can't get anything,

  • because there's nothing there.

  • I need to give it my index.html file.

  • And the way that I can do that is

  • by using Express to host static files.

  • So what do I mean by that?

  • First, let me type it into the code.

  • So I'm going to say app.use.

  • I want to use express.static.

  • And then what I need to give here is a directory name--

  • or I could give one file.

  • I might be able to say index.html.

  • But better yet, I want to make up a folder name.

  • Now, I'm going to call it public,

  • because I'm going to remind myself

  • that anything that I put in that directory

  • is publicly accessible from the URL,

  • in this case which is localhost colon 3,000.

  • So I'm going to go back to my finder,

  • and I'm going to make a folder, I'm going to call it public,

  • and I'm going to put index.html in there.

  • So now, when I run this--

  • I'm going to re-run my server by saying node index.js.

  • It's listening at port 3,000.

  • I go back and I refresh this page--

  • it doesn't say cannot get anymore.

  • The problem is, there's nothing there.

  • Well, it might be nice for me to actually add something

  • to my index.html file.

  • I could say Data Selfie App, add a paragraph, Hello.

  • And I could start putting JavaScript

  • in there and other things that we've seen so far.

  • And now, I'm going to hit Refresh.

  • And there we go.

  • I am serving up my web page.

  • Now, I haven't gotten that far.

  • I'm not saying we've gotten this far.

  • But I'm really just setting up the foundation.

  • I'm building the foundation for the house--

  • this project that I'm going to build.

  • What have I done so far?

  • I've installed Node.

  • I've set up a project with NPM init,

  • configuring a package.json.

  • I've written a little bit of code inside an index.js file,

  • using the Node module Express to create a web server.

  • And that web server has one job-- it has only one job--

  • it's to serve up any files that are in the public folder.

  • And the only file I have there right now is index.html.

  • If I wanted to be really accurate about what's going on,

  • I would type in index.html into the address bar itself.

  • And now when I hit Enter, you'll see it's the same page.

  • But I didn't have to do that originally,

  • because if you ever do a blank path, index.html is assumed.

  • If you're able to reproduce exactly what I have here, just

  • a basic Node server with Express,

  • serving up a single index.html file,

  • you're ready to move on to the next video, where

  • I'm going to start actually adding some features

  • and trying some different ideas out.

  • Before you go there, let me suggest a couple exercises

  • you could try.

  • Number one, maybe try to host more than one page.

  • What if you have index.html and something else dot html.

  • Or two different directories-- how could you do that?

  • Could you have subdirectories inside of public,

  • and how would you access them?

  • Do you put links so you could go back and forth between the two?

  • That would be a good thing to try out.

  • I'll put some solutions to that in the links

  • to that the video's description as well.

  • You might also go and grab something

  • that you've made previously, maybe

  • one of the examples from module 1,

  • and put that JavaScript and that HTML content

  • in index.html Itself, and see what happens.

  • Because I have plenty to do with the server,

  • the whole thing about this project

  • is saving data to a database.

  • And that's what I going to do in the next video.

  • I'm going to start to add more stuff to the HTML page.

  • And what I want to demonstrate to you

  • is how to use the geolocation API.

  • So if it's available, you have to opt-in and give permission,

  • you can capture, with this API, the latitude and longitude

  • of where your computer or device is.

  • Whether it's accurate or not is an interesting question.

  • And then, later, I'm going to show you

  • how to send that to the server so that the server can

  • save that along with a timestamp and maybe keep track

  • of your location over time.

  • That's something that I'm going to show you how to do.

  • All right.

  • So I'll see you the next video, where we'll

  • look at the geolocation API.

  • [DING]

  • [MUSIC PLAYING]

[DING]

Subtitles and vocabulary

Click the word to look it up Click the word to find further inforamtion about it