Skip to content

Commit 766bf4e

Browse files
pratikdasPratik Dasthombergs
authored
Express getting started (thombergs#147)
* added code * removed cdk code * added code examples * added ts files Co-authored-by: Pratik Das <[email protected]> Co-authored-by: Tom Hombergs <[email protected]>
1 parent 0d7b195 commit 766bf4e

File tree

10 files changed

+306
-0
lines changed

10 files changed

+306
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Related Blog Posts
2+
3+
* [Getting Started with Express](https://reflectoring.io/getting-started-with-express/)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import express, { Request, Response, NextFunction } from 'express';
2+
3+
const app = express();
4+
const port = 3000;
5+
6+
7+
interface Product {
8+
name: string;
9+
price: number;
10+
brand: string;
11+
};
12+
13+
const getProducts = (request: Request, response: Response, next: NextFunction) => {
14+
let products: Product[] = [
15+
{"name":"television", "price":112.34, "brand":"samsung"},
16+
{"name":"washing machine", "price": 345.34, "brand": "LG"},
17+
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}
18+
]
19+
20+
response.status(200).json(products);
21+
}
22+
app.get('/products', getProducts);
23+
24+
app.listen(port, () => {
25+
console.log(`Server listening at port ${port}.`);
26+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// errormiddleware.js
2+
const errorLogger = (err, request, response, next) => {
3+
console.log( `error ${err.message}`)
4+
next(err) // calling next middleware
5+
}
6+
7+
const errorResponder = (err, request, response, next) => {
8+
response.header("Content-Type", 'application/json')
9+
10+
const status = err.status || 400
11+
response.status(status).send(err.message)
12+
}
13+
const invalidPathHandler = (request, response, next) => {
14+
response.status(400)
15+
response.send('invalid path')
16+
}
17+
18+
module.exports = { errorLogger, errorResponder, invalidPathHandler }
19+
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
const express = require('express');
2+
3+
const app = express();
4+
5+
const requestLogger = (request, response, next) => {
6+
console.log(request);
7+
next();
8+
};
9+
10+
const requireJsonContent = (request, response, next) => {
11+
if (request.headers['content-type'] !== 'application/json') {
12+
response.status(400).send('Server requires application/json')
13+
} else {
14+
next()
15+
}
16+
}
17+
18+
app.use(requestLogger);
19+
20+
21+
app.use((err, request, response, next) => {
22+
response.status(500).send('Error!')
23+
})
24+
25+
// Set the body size limit to 100 bytes
26+
app.use(express.json({ limit: 100 }));
27+
28+
app.use(express.urlencoded({ extended: false }));
29+
30+
let products = [{"name":"television", "price":112.34, "brand":"samsung"},
31+
{"name":"washing machine", "price": 345.34, "brand": "LG"},
32+
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}];
33+
34+
35+
// handle get request for path /
36+
app.get('/', (request, response) => {
37+
response.send('response for GET request');
38+
});
39+
40+
// handle get request for path /products
41+
app.get('/products', (request, response) => {
42+
43+
response.json(products);
44+
});
45+
46+
// handle get request for path /products
47+
app.get('/products/:brand', (request, response) => {
48+
49+
const brand = req.params.brand;
50+
51+
console.log("brand ${brand} " + brand);
52+
53+
const productsFiltered = products.filter(product=> product.brand == brand);
54+
55+
response.json(productsFiltered);
56+
});
57+
58+
// handle post request for path /products
59+
app.post('/products', requireJsonContent, (request, response) => {
60+
const products = [];
61+
62+
const name = req.body.name ;
63+
64+
const brand = req.body.brand;
65+
66+
console.log(name + " " + brand);
67+
68+
products.push({name: req.body.name, brand: req.body.brand, price: req.body.price});
69+
70+
const productCreationResponse = {productID: "12345", result: "success"};
71+
response.json(productCreationResponse);
72+
});
73+
74+
app.set('view engine', 'pug')
75+
app.set('views', './views')
76+
app.get('/home', (request, response) => {
77+
response.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
78+
})
79+
80+
81+
// handle get request with 3 middleware functions
82+
app.get('/users', (request, response, next) => {
83+
console.log("Stage 1 processing ");
84+
next()
85+
},
86+
(request, response, next) => {
87+
console.log("Stage 2 processing ");
88+
next();
89+
},
90+
(request, response) => {
91+
response.send('response for GET request');
92+
});
93+
94+
95+
app.get('/products/error', (request, response) => {
96+
throw new Error("processing error!")
97+
});
98+
// start the server
99+
const port = 3000
100+
app.listen(3000,
101+
() => console.log(`Server listening on port ${port}.`));
102+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// middleware.js
2+
3+
const requestLogger = (request, response, next) => {
4+
console.log(request);
5+
next();
6+
};
7+
8+
const requireJsonContent = (request, response, next) => {
9+
if (request.headers['content-type'] !== 'application/json') {
10+
response.status(400).send('Server requires application/json')
11+
} else {
12+
next()
13+
}
14+
}
15+
16+
module.exports = { requestLogger, requireJsonContent}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "storefront",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"serve": "nodemon app.ts"
9+
},
10+
"keywords": [],
11+
"author": "",
12+
"license": "ISC",
13+
"dependencies": {
14+
"express": "^4.17.2",
15+
"pug": "^3.0.2"
16+
},
17+
"devDependencies": {
18+
"@types/express": "^4.17.13",
19+
"@types/node": "^17.0.17",
20+
"nodemon": "^2.0.15",
21+
"ts-node": "^10.5.0",
22+
"typescript": "^4.5.5"
23+
}
24+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// routes.js
2+
const express = require('express')
3+
const { requireJsonContent } = require('./middleware')
4+
5+
const router = express.Router()
6+
7+
// Set the body size limit to 100 bytes
8+
router.use(express.json({ limit: 100 }))
9+
10+
let products = [{"name":"television", "price":112.34, "brand":"samsung"},
11+
{"name":"washing machine", "price": 345.34, "brand": "LG"},
12+
{"name":"Macbook", "price": 3454.34, "brand": "Apple"}];
13+
14+
// handle get request for path /products
15+
router.get('/products', (request, response) => {
16+
console.log(products)
17+
response.json(products)
18+
});
19+
20+
// handle get request for path /products
21+
router.get('/products/:brand', (request, response) => {
22+
23+
const brand = request.params.brand;
24+
25+
console.log(`brand ${brand} `);
26+
27+
const productsFiltered = products.filter(product=> product.brand == brand);
28+
29+
response.json(productsFiltered);
30+
});
31+
32+
33+
// handle post request for path /products
34+
router.post('/products', requireJsonContent,(request, response) => {
35+
36+
const name = request.body.name ;
37+
38+
const brand = request.body.brand;
39+
40+
console.log(name + " " + brand);
41+
42+
products.push({name: request.body.name, brand: request.body.brand, price: request.body.price});
43+
44+
const productCreationResponse = {productID: "12345", result: "success"};
45+
response.json(productCreationResponse);
46+
});
47+
48+
// handle put request for path /products
49+
router.put('/products', (request, response) => {
50+
51+
const name = request.body.name ;
52+
53+
const brand = request.body.brand;
54+
55+
console.log(name + " " + brand);
56+
57+
products.push({name: request.body.name, brand: request.body.brand, price: request.body.price});
58+
59+
const productCreationResponse = {productID: "12345", result: "success"};
60+
response.json(productCreationResponse);
61+
})
62+
63+
router.get('/home', (request, response) => {
64+
console.log("rendering...")
65+
response.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
66+
})
67+
68+
router.get('/productswitherror', (request, response) => {
69+
let err = new Error("processing error ")
70+
err.statusCode = 400
71+
throw err
72+
});
73+
74+
75+
module.exports = router
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// server.js
2+
const express = require('express')
3+
const routes = require('./routes')
4+
5+
const { requestLogger } = require('./middleware')
6+
const { errorLogger, errorResponder, invalidPathHandler } = require('./errormiddleware')
7+
8+
9+
const app = express()
10+
const PORT = process.env.PORT || 3000
11+
12+
app.use(requestLogger)
13+
app.use(routes)
14+
15+
app.use(errorLogger)
16+
app.use(errorResponder)
17+
app.use(invalidPathHandler)
18+
19+
app.set('view engine', 'pug')
20+
app.set('views', './views')
21+
22+
23+
app.listen(PORT, () => {
24+
console.log(`Server listening at http://localhost:${PORT}`)
25+
})
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs",
4+
"target": "es6",
5+
"rootDir": "./",
6+
"esModuleInterop": true
7+
}
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
html
2+
head
3+
title= title
4+
body
5+
h1= message
6+
div
7+
p Generated by express at
8+
span= sysdate

0 commit comments

Comments
 (0)