Express getting started (#147)

* added code

* removed cdk code

* added code examples

* added ts files

Co-authored-by: Pratik Das <pratikd2001@gmail.com>
Co-authored-by: Tom Hombergs <tom.hombergs@gmail.com>
This commit is contained in:
Pratik Das
2022-02-15 01:20:45 +05:30
committed by GitHub
parent 0d7b195e78
commit 766bf4eda2
10 changed files with 306 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
# Related Blog Posts
* [Getting Started with Express](https://reflectoring.io/getting-started-with-express/)

View File

@@ -0,0 +1,26 @@
import express, { Request, Response, NextFunction } from 'express';
const app = express();
const port = 3000;
interface Product {
name: string;
price: number;
brand: string;
};
const getProducts = (request: Request, response: Response, next: NextFunction) => {
let products: Product[] = [
{"name":"television", "price":112.34, "brand":"samsung"},
{"name":"washing machine", "price": 345.34, "brand": "LG"},
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}
]
response.status(200).json(products);
}
app.get('/products', getProducts);
app.listen(port, () => {
console.log(`Server listening at port ${port}.`);
});

View File

@@ -0,0 +1,19 @@
// errormiddleware.js
const errorLogger = (err, request, response, next) => {
console.log( `error ${err.message}`)
next(err) // calling next middleware
}
const errorResponder = (err, request, response, next) => {
response.header("Content-Type", 'application/json')
const status = err.status || 400
response.status(status).send(err.message)
}
const invalidPathHandler = (request, response, next) => {
response.status(400)
response.send('invalid path')
}
module.exports = { errorLogger, errorResponder, invalidPathHandler }

View File

@@ -0,0 +1,102 @@
const express = require('express');
const app = express();
const requestLogger = (request, response, next) => {
console.log(request);
next();
};
const requireJsonContent = (request, response, next) => {
if (request.headers['content-type'] !== 'application/json') {
response.status(400).send('Server requires application/json')
} else {
next()
}
}
app.use(requestLogger);
app.use((err, request, response, next) => {
response.status(500).send('Error!')
})
// Set the body size limit to 100 bytes
app.use(express.json({ limit: 100 }));
app.use(express.urlencoded({ extended: false }));
let products = [{"name":"television", "price":112.34, "brand":"samsung"},
{"name":"washing machine", "price": 345.34, "brand": "LG"},
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}];
// handle get request for path /
app.get('/', (request, response) => {
response.send('response for GET request');
});
// handle get request for path /products
app.get('/products', (request, response) => {
response.json(products);
});
// handle get request for path /products
app.get('/products/:brand', (request, response) => {
const brand = req.params.brand;
console.log("brand ${brand} " + brand);
const productsFiltered = products.filter(product=> product.brand == brand);
response.json(productsFiltered);
});
// handle post request for path /products
app.post('/products', requireJsonContent, (request, response) => {
const products = [];
const name = req.body.name ;
const brand = req.body.brand;
console.log(name + " " + brand);
products.push({name: req.body.name, brand: req.body.brand, price: req.body.price});
const productCreationResponse = {productID: "12345", result: "success"};
response.json(productCreationResponse);
});
app.set('view engine', 'pug')
app.set('views', './views')
app.get('/home', (request, response) => {
response.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
})
// handle get request with 3 middleware functions
app.get('/users', (request, response, next) => {
console.log("Stage 1 processing ");
next()
},
(request, response, next) => {
console.log("Stage 2 processing ");
next();
},
(request, response) => {
response.send('response for GET request');
});
app.get('/products/error', (request, response) => {
throw new Error("processing error!")
});
// start the server
const port = 3000
app.listen(3000,
() => console.log(`Server listening on port ${port}.`));

View File

@@ -0,0 +1,16 @@
// middleware.js
const requestLogger = (request, response, next) => {
console.log(request);
next();
};
const requireJsonContent = (request, response, next) => {
if (request.headers['content-type'] !== 'application/json') {
response.status(400).send('Server requires application/json')
} else {
next()
}
}
module.exports = { requestLogger, requireJsonContent}

View File

@@ -0,0 +1,24 @@
{
"name": "storefront",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "nodemon app.ts"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.2",
"pug": "^3.0.2"
},
"devDependencies": {
"@types/express": "^4.17.13",
"@types/node": "^17.0.17",
"nodemon": "^2.0.15",
"ts-node": "^10.5.0",
"typescript": "^4.5.5"
}
}

View File

@@ -0,0 +1,75 @@
// routes.js
const express = require('express')
const { requireJsonContent } = require('./middleware')
const router = express.Router()
// Set the body size limit to 100 bytes
router.use(express.json({ limit: 100 }))
let products = [{"name":"television", "price":112.34, "brand":"samsung"},
{"name":"washing machine", "price": 345.34, "brand": "LG"},
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}];
// handle get request for path /products
router.get('/products', (request, response) => {
console.log(products)
response.json(products)
});
// handle get request for path /products
router.get('/products/:brand', (request, response) => {
const brand = request.params.brand;
console.log(`brand ${brand} `);
const productsFiltered = products.filter(product=> product.brand == brand);
response.json(productsFiltered);
});
// handle post request for path /products
router.post('/products', requireJsonContent,(request, response) => {
const name = request.body.name ;
const brand = request.body.brand;
console.log(name + " " + brand);
products.push({name: request.body.name, brand: request.body.brand, price: request.body.price});
const productCreationResponse = {productID: "12345", result: "success"};
response.json(productCreationResponse);
});
// handle put request for path /products
router.put('/products', (request, response) => {
const name = request.body.name ;
const brand = request.body.brand;
console.log(name + " " + brand);
products.push({name: request.body.name, brand: request.body.brand, price: request.body.price});
const productCreationResponse = {productID: "12345", result: "success"};
response.json(productCreationResponse);
})
router.get('/home', (request, response) => {
console.log("rendering...")
response.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
})
router.get('/productswitherror', (request, response) => {
let err = new Error("processing error ")
err.statusCode = 400
throw err
});
module.exports = router

View File

@@ -0,0 +1,25 @@
// server.js
const express = require('express')
const routes = require('./routes')
const { requestLogger } = require('./middleware')
const { errorLogger, errorResponder, invalidPathHandler } = require('./errormiddleware')
const app = express()
const PORT = process.env.PORT || 3000
app.use(requestLogger)
app.use(routes)
app.use(errorLogger)
app.use(errorResponder)
app.use(invalidPathHandler)
app.set('view engine', 'pug')
app.set('views', './views')
app.listen(PORT, () => {
console.log(`Server listening at http://localhost:${PORT}`)
})

View File

@@ -0,0 +1,8 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"rootDir": "./",
"esModuleInterop": true
}
}

View File

@@ -0,0 +1,8 @@
html
head
title= title
body
h1= message
div
p Generated by express at
span= sysdate