From 6d122d285ba76ea6406869cccf6272e82ff0bcfc Mon Sep 17 00:00:00 2001 From: Pratik Das Date: Thu, 3 Feb 2022 22:55:10 +0530 Subject: [PATCH] added code examples --- node/express/getting-started/README.md | 3 + .../getting-started/errormiddleware.js | 18 +++ node/express/getting-started/index.js | 110 ++++++++++++++++++ node/express/getting-started/middleware.js | 16 +++ node/express/getting-started/package.json | 16 +++ node/express/getting-started/routes.js | 74 ++++++++++++ node/express/getting-started/server.js | 25 ++++ node/express/getting-started/views/home.pug | 8 ++ 8 files changed, 270 insertions(+) create mode 100644 node/express/getting-started/README.md create mode 100644 node/express/getting-started/errormiddleware.js create mode 100644 node/express/getting-started/index.js create mode 100644 node/express/getting-started/middleware.js create mode 100644 node/express/getting-started/package.json create mode 100644 node/express/getting-started/routes.js create mode 100644 node/express/getting-started/server.js create mode 100644 node/express/getting-started/views/home.pug diff --git a/node/express/getting-started/README.md b/node/express/getting-started/README.md new file mode 100644 index 0000000..941d4ad --- /dev/null +++ b/node/express/getting-started/README.md @@ -0,0 +1,3 @@ +# Related Blog Posts + +* [Getting Started with Express](https://reflectoring.io/getting-started-with-express/) diff --git a/node/express/getting-started/errormiddleware.js b/node/express/getting-started/errormiddleware.js new file mode 100644 index 0000000..9f2885f --- /dev/null +++ b/node/express/getting-started/errormiddleware.js @@ -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 } + diff --git a/node/express/getting-started/index.js b/node/express/getting-started/index.js new file mode 100644 index 0000000..e69e8fe --- /dev/null +++ b/node/express/getting-started/index.js @@ -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}.`)); + diff --git a/node/express/getting-started/middleware.js b/node/express/getting-started/middleware.js new file mode 100644 index 0000000..c51b197 --- /dev/null +++ b/node/express/getting-started/middleware.js @@ -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} \ No newline at end of file diff --git a/node/express/getting-started/package.json b/node/express/getting-started/package.json new file mode 100644 index 0000000..9ad7f4d --- /dev/null +++ b/node/express/getting-started/package.json @@ -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" + } +} diff --git a/node/express/getting-started/routes.js b/node/express/getting-started/routes.js new file mode 100644 index 0000000..89a5550 --- /dev/null +++ b/node/express/getting-started/routes.js @@ -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 \ No newline at end of file diff --git a/node/express/getting-started/server.js b/node/express/getting-started/server.js new file mode 100644 index 0000000..eaaacf2 --- /dev/null +++ b/node/express/getting-started/server.js @@ -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}`) +}) \ No newline at end of file diff --git a/node/express/getting-started/views/home.pug b/node/express/getting-started/views/home.pug new file mode 100644 index 0000000..7eafc35 --- /dev/null +++ b/node/express/getting-started/views/home.pug @@ -0,0 +1,8 @@ +html + head + title= title + body + h1= message + div + p Generated by express at + span= sysdate \ No newline at end of file