Try   HackMD

Express

https://www.npmjs.com/package/express

One of the most popular libraries to build server with node.

Install

$ npm install express

Building a server with Express.js

const express = require('express');
const app = express();
app.listen(3000);
  • express() - const app = express()
  • listen() - app.listen(3000)

Do a GET request in Express

const express = require('express');

const app = express();

app.get('/', (request, response) => {
    response.send("helllloooo")
});

app.listen(3000);

Basic routing

app.METHOD(PATH, HANDLER)
  • app - an instance of express
  • METHOD - HTTP request method
  • PATH - path on the server
  • HANDLER - function executed when route is matched\

Content type is automatically converted:

  • text/HTML
  • application/JSON is also automatically converted
    ​​​​const express = require('express');
    ​​​​const res = require('express/lib/response');
    ​​​​
    ​​​​const app = express();
    ​​​​
    ​​​​app.get('/', (request, response) => {
    ​​​​    const user = {
    ​​​​        name: "Sally",
    ​​​​        hobby: "soccer"
    ​​​​    };
    ​​​​    response.send(user); // don't need to use JSON.stringify()
    ​​​​});
    ​​​​
    ​​​​app.listen(3000);
    

Express Middleware

const express = require('express');
const app = express();

app.use ( (req, res, next)=> {
    consol.log('<h1>hellooooo</h1>');
    next();
})
  • .use() - a generic express middleware
    • req
    • res
    • next() - In order for the middleware to keep passing through, it needs to call: next()

The way middleware works:

  1. app.use() gets the request of the website
  2. do whatever you want with it (in the case above, just console.log)
  3. hit next() and express keeps running through the rest of the code

Middleware: Something that receives ahead of time before getting through the routes.

Using body-parser as a middleware

app.post('/profile', (req, res) => {
    console.log(req.body)
    req.send(user)
})

If we want to access req.body, we need to use a middleware: body-parser - npm (npmjs.com), it will grab anything it receives and parse it

npm install body-parser

💡Express Version Update

If you are running a version of Express that is 4.16+, it now includes the same functionality inside of Express. Instead of adding these lines in the code like:

  1. app.use(bodyparser.urlencoded({extended: false}));
  2. app.use(bodyparser.json());

If you are using Express 4.16+ you can now replace that with:

  1. app.use(express.urlencoded({extended: false}));
  2. app.use(express.json());

app.use()

app.use(express.urlencoded({extended: false}));
app.use(express.json())

app.post('/profile', (req, res) => {
    console.log(req.body)
    res.send('Success!')
})
  • form tag: app.use(express.urlencoded({extended: false}));
  • JSON: app.use(express.json())

RESTful API

  • url parameters should make sense
  • http request is the verb, and the url is the noun
  • stateless: calls can be made independently of one another

Request Properties

Most used properties of request:

  • req.query - ?key1=value1&key2=value2
  • req.body - use app.use() middleware to send it to the body
  • req.headers
  • req.params - e.g. :id If there are more than 1 params e.g. /user/:name/:date , req.params will return an object.
    ​​​​// 127.0.0.1:3000/users/tom/0423
    ​​​​{ name: 'tom', date: '0423'}
    
  • req.query - e.g. ?q="hello"
    ​​​​app.get('/users/:name', functions(req,res){
    ​​​​    const myName = req.params.name;
    ​​​​    const query = **req.query**
    ​​​​    res.send('<html><head></head><body><h1>'+myName+'</body></html>')
    ​​​​})
    
    ​​​​// 127.0.0.1:3000/users/tom?q=hello&limit=30
    ​​​​{q: 'hello', limit: '30'} 
    

Response Properties

Most used properties of response

  • res.status() - res.status(404)
  • res.send()
app.get('/:id', (req, res) => {
    // console.log(req.query)
    // console.log(req.headers)
    // console.log(req.body)
    // console.log(req.params)
    res.status(404).send('Not Found!')
    res.send('getting root');
});

Sending a static file

  1. create a public folder
  2. inside public folder, create an index.html file
  3. send a static file
const app = express()

app.use(express.static(__dirname + '/public'))
  • express.static()

__dirname does not work in ES modules.

Solutions:

  1. Change it back to Common JS: remove “type”: “module” in the package.json file
  2. Add these lines to sever.js file
import path from "path" 
const __dirname = path.resolve()

Node File System Module

Read file

hello.txt:

helllooo there!!

script.js:

const fs = require('fs'); // Using the built-in 'fs' module

// asynchronous: is going to continue read through the file, when it's done, execute the call back
fs.readfile('./hello.txt', (err, data) => {
    if (err) {
        console.log('errrorrrr');
    }
    console.log('Async', data.toString());
})

// synchronous
const file = fs.readFileSync(./hellotxt’); // is going to hault the file
console.log('Sync', file.toString())

// Expected Output
// Sync helllooo there!!
// Async helllooo there!!
  • const fs = require('fs'); - access the fs module
  • fs.readfile()
    • '' - path
    • (err, data) ⇒ {} - function with err and data parameters
  • .toString()
    • default param - .toString('utf8') : type of encoding, mostly used in web
  • fs.readFileSync(’./hellotxt’)

readFile() vs. readFileSync()

  • readFile() is async: will continue to read through the file, and until it’s done it will continue execute the callback function
  • readFileSync() is sync: will block the file until it’s done

Append to File

appendFile()

script.js:

// APPEND
fs**.appendFile**('./hello.txt', ' This is so cool!', err => {
    if(err){
        console.log(err)
    }
})

hello.txt:

helllooo there!! This is so cool!

Add File

.writeFile()
// WRITE
fs.writeFile('bye.txt', 'Sad to see you go', err => {
    if (err) {
        console.log(err)
    }
})

created a new file: bye.txt

Sad to see you go

Delete File

.unlink()
//DELETE
fs.unlink('./bye.txt', err => {
	if (err) {
		console.log(err)
	}
	console.log('Inception')
})

→ bye.txt is removed