---
# System prepended metadata

title: 03 NodeJS HTTP Server
tags: [BED, School, Notes, DISM]

---

---
title: '03 NodeJS HTTP Server'
disqus: hackmd
---

03 NodeJS HTTP Server
===

<style>
img{
/*     border: 2px solid red; */
    margin-left: auto;
    margin-right: auto;
    width: 90%;
    display: block;
}
</style>


## Table of Contents

[TOC]

HTTP
---
- most popular app layer protocol used for communicating between client and server
- provides standardised way for comps to communicate with ea other
    - specifies how client's request data will be constructed and set to server
    - and how server responds to these reqs
- to comm with server, client must indicate HTTP action like
    - GET
    - POST
    - PUT
    - DELETE
    - TRACE
    - OPTIONS
    - CONNECT
- in http protocol, req msg typically carries info like action and target URL in req msg
- when server receives req, server will
    - retrieve data from its data storage
    - package data in appropriate format
    - send data back to client
    - data is typically in html/css/js or JSON format for resful web services

![](https://i.imgur.com/EXS3fbm.png)

### HTTP Request Format
![](https://i.imgur.com/z3uVWMq.png)

### HTTP Response Format
![](https://i.imgur.com/wtjV515.png)
- 3 parts
    - status line
        - Eg. 200
    - headers
        - Eg. data format encoding of returned msg data
    - actual body of msg
        - Eg. html code for index.html
        - OR JSON format

### Common HTTP Response Codes
![](https://i.imgur.com/hlIVJDa.png)


Javascript Object Notation (JSON)
---
### Features
- lightweight
- language independent
- easy to read and write
- text based, human readable data exchange format
- uses key pairs describing the obj

```javascript=
var student1={
   "name":"John",
   "age":"18",
   "course":"DIT"
};

// directly use json obj by calling name of var and prop
console.log(student1.name);
console.log(student1.age);
console.log(student1.course);

// convert js obj to json, use stringify
var jsonStudent=JSON.stringify(jsStudent);
```

1st Node Server App
---
- js modules built into nodejs
    - http module
        - provides high performing foundation for http stack
    - path module
        - provides resolving of full paths, check of file paths etc.
    - file module
        - provides file reading, checking purposes

### HTTP Modules
- http module supports `createServer` function which takes in callback as a param
    - callback has 2 params, request and response
        - req is req msg that comes from client to process and extract info from
        - resp is resp msg we construct with header values and body of http resp msg


### Path Module
- enables us to exmine whether file exists/more details abt file eg. file extension
- has func for us to convert relative path to absolute

### Creating HTTP Server
- create `public/` folder which will contain all static files to be served to client
- `npm init`
- create `server.js` at root

```javascript=
const http = require('http');
const fs = require('fs');
const path = require('path');

const hostname = 'localhost';
const port = 3000;
const server = http.createServer((req, res) => {
    console.log('Request for page ' + req.url + ' using ' + req.method + ‘method’);
    if (req.method == 'GET') {
      var fileUrl=req.url;

      if (req.url == '/') //default file is index.html
        fileUrl = '/index.html';
  
      var filePath = path.resolve('./public'+fileUrl);

        fs.exists(filePath, (exists) => {
            if (!exists) {
                fileUrl='/error.html';
                filePath = path.resolve('./public'+fileUrl);
            
            }else{
                res.statusCode = 200;
                res.setHeader('Content-Type', 'text/html');
            }
            fs.createReadStream(filePath).pipe(res);
        });
    }
    else {
        fileUrl='/error.html';
        filePath = path.resolve('./public'+fileUrl);
        fs.createReadStream(filePath).pipe(res);

    }
});


server.listen(port, hostname, () => {
  console.log(`Server started and accessible via http://${hostname}:${port}/`);
});
```

```bash
# to run server
node server.js
# or use nodemon
```

#### Creating Static html Files
```htmlembedded=
<!-- index.html -->
<html>
    <body>
        Welcome to Node JS!!
    </body>
</html>

<!-- error.html -->
<html>
    <body>
        File does not exist or web server does not support post method!
    </body>
</html>
```




###### tags: `BED` `DISM` `School` `Notes`