added code examples
This commit is contained in:
3
node/express/getting-started/README.md
Normal file
3
node/express/getting-started/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Related Blog Posts
|
||||||
|
|
||||||
|
* [Getting Started with Express](https://reflectoring.io/getting-started-with-express/)
|
||||||
18
node/express/getting-started/errormiddleware.js
Normal file
18
node/express/getting-started/errormiddleware.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// errormiddleware.js
|
||||||
|
const errorLogger = (err, req, res, next) => {
|
||||||
|
console.log( `error ${err.message}`)
|
||||||
|
next(err) // calling next middleware
|
||||||
|
}
|
||||||
|
|
||||||
|
const errorResponder = (err, req, res, next) => {
|
||||||
|
res.header("Content-Type", 'application/json')
|
||||||
|
|
||||||
|
res.status(err.statusCode).send(err.message)
|
||||||
|
}
|
||||||
|
const invalidPathHandler = (req, res, next) => {
|
||||||
|
res.status(400)
|
||||||
|
res.send('invalid path')
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { errorLogger, errorResponder, invalidPathHandler }
|
||||||
|
|
||||||
110
node/express/getting-started/index.js
Normal file
110
node/express/getting-started/index.js
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
const express = require('express');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
const requestLogger = (req, res, next) => {
|
||||||
|
console.log(req);
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
|
||||||
|
const requireJsonContent = (req, res, next) => {
|
||||||
|
if (req.headers['content-type'] !== 'application/json') {
|
||||||
|
res.status(400).send('Server requires application/json')
|
||||||
|
} else {
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app.use(requestLogger);
|
||||||
|
|
||||||
|
const myErrorHandler = (err, req, res, next) => {
|
||||||
|
if (req.foo) {
|
||||||
|
res.status(500).send('Fail!');
|
||||||
|
}else {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
app.use(myErrorHandler);
|
||||||
|
app.use((err, req, res, next) => {
|
||||||
|
res.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('/', (req, res) => {
|
||||||
|
res.send('response for GET request');
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle get request for path /products
|
||||||
|
app.get('/products', (req, res) => {
|
||||||
|
|
||||||
|
res.json(products);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle get request for path /products
|
||||||
|
app.get('/products/:brand', (req, res) => {
|
||||||
|
|
||||||
|
const brand = req.params.brand;
|
||||||
|
|
||||||
|
console.log("brand ${brand} " + brand);
|
||||||
|
|
||||||
|
const productsFiltered = products.filter(product=> product.brand == brand);
|
||||||
|
|
||||||
|
res.json(productsFiltered);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle post request for path /products
|
||||||
|
app.post('/products', requireJsonContent, (req, res) => {
|
||||||
|
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"};
|
||||||
|
res.json(productCreationResponse);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.set('view engine', 'pug')
|
||||||
|
app.set('views', './views')
|
||||||
|
app.get('/home', (req, res) => {
|
||||||
|
res.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// handle get request with 3 middleware functions
|
||||||
|
app.get('/users', (req, res, next) => {
|
||||||
|
console.log("Stage 1 processing ");
|
||||||
|
next()
|
||||||
|
},
|
||||||
|
(req, res, next) => {
|
||||||
|
console.log("Stage 2 processing ");
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
(req, res) => {
|
||||||
|
res.send('response for GET request');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
app.get('/products/error', (req, res) => {
|
||||||
|
throw new Error("processing error!")
|
||||||
|
});
|
||||||
|
// start the server
|
||||||
|
const port = 3000
|
||||||
|
app.listen(3000,
|
||||||
|
() => console.log(`Server listening on port ${port}.`));
|
||||||
|
|
||||||
16
node/express/getting-started/middleware.js
Normal file
16
node/express/getting-started/middleware.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// middleware.js
|
||||||
|
|
||||||
|
const requestLogger = (req, res, next) => {
|
||||||
|
console.log(req);
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
|
||||||
|
const requireJsonContent = (req, res, next) => {
|
||||||
|
if (req.headers['content-type'] !== 'application/json') {
|
||||||
|
res.status(400).send('Server requires application/json')
|
||||||
|
} else {
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { requestLogger, requireJsonContent}
|
||||||
16
node/express/getting-started/package.json
Normal file
16
node/express/getting-started/package.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "storefront",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.17.2",
|
||||||
|
"pug": "^3.0.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
74
node/express/getting-started/routes.js
Normal file
74
node/express/getting-started/routes.js
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
// 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', (req, res) => {
|
||||||
|
res.json(products);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle get request for path /products
|
||||||
|
router.get('/products/:brand', (req, res) => {
|
||||||
|
|
||||||
|
const brand = req.params.brand;
|
||||||
|
|
||||||
|
console.log(`brand ${brand} `);
|
||||||
|
|
||||||
|
const productsFiltered = products.filter(product=> product.brand == brand);
|
||||||
|
|
||||||
|
res.json(productsFiltered);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// handle post request for path /products
|
||||||
|
router.post('/products', requireJsonContent,(req, res) => {
|
||||||
|
|
||||||
|
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"};
|
||||||
|
res.json(productCreationResponse);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle put request for path /products
|
||||||
|
router.put('/products', (req, res) => {
|
||||||
|
|
||||||
|
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"};
|
||||||
|
res.json(productCreationResponse);
|
||||||
|
})
|
||||||
|
|
||||||
|
router.get('/home', (req, res) => {
|
||||||
|
console.log("rendering...")
|
||||||
|
res.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()})
|
||||||
|
})
|
||||||
|
|
||||||
|
router.get('/productswitherror', (req, res) => {
|
||||||
|
let err = new Error("processing error ")
|
||||||
|
err.statusCode = 400
|
||||||
|
throw err
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = router
|
||||||
25
node/express/getting-started/server.js
Normal file
25
node/express/getting-started/server.js
Normal 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}`)
|
||||||
|
})
|
||||||
8
node/express/getting-started/views/home.pug
Normal file
8
node/express/getting-started/views/home.pug
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
html
|
||||||
|
head
|
||||||
|
title= title
|
||||||
|
body
|
||||||
|
h1= message
|
||||||
|
div
|
||||||
|
p Generated by express at
|
||||||
|
span= sysdate
|
||||||
Reference in New Issue
Block a user