diff --git a/node/express/getting-started/app.ts b/node/express/getting-started/app.ts new file mode 100644 index 0000000..fbbd29d --- /dev/null +++ b/node/express/getting-started/app.ts @@ -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}.`); + }); \ No newline at end of file diff --git a/node/express/getting-started/errormiddleware.js b/node/express/getting-started/errormiddleware.js index 9f2885f..9664ac6 100644 --- a/node/express/getting-started/errormiddleware.js +++ b/node/express/getting-started/errormiddleware.js @@ -1,17 +1,18 @@ // errormiddleware.js -const errorLogger = (err, req, res, next) => { +const errorLogger = (err, request, response, next) => { console.log( `error ${err.message}`) next(err) // calling next middleware } - const errorResponder = (err, req, res, next) => { - res.header("Content-Type", 'application/json') +const errorResponder = (err, request, response, next) => { + response.header("Content-Type", 'application/json') - res.status(err.statusCode).send(err.message) + const status = err.status || 400 + response.status(status).send(err.message) } - const invalidPathHandler = (req, res, next) => { - res.status(400) - res.send('invalid path') +const invalidPathHandler = (request, response, next) => { + response.status(400) + response.send('invalid path') } module.exports = { errorLogger, errorResponder, invalidPathHandler } diff --git a/node/express/getting-started/index.js b/node/express/getting-started/index.js index e69e8fe..7fdb3bd 100644 --- a/node/express/getting-started/index.js +++ b/node/express/getting-started/index.js @@ -2,14 +2,14 @@ const express = require('express'); const app = express(); -const requestLogger = (req, res, next) => { - console.log(req); +const requestLogger = (request, response, next) => { + console.log(request); next(); }; -const requireJsonContent = (req, res, next) => { - if (req.headers['content-type'] !== 'application/json') { - res.status(400).send('Server requires application/json') +const requireJsonContent = (request, response, next) => { + if (request.headers['content-type'] !== 'application/json') { + response.status(400).send('Server requires application/json') } else { next() } @@ -17,17 +17,9 @@ const requireJsonContent = (req, res, 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!') +app.use((err, request, response, next) => { + response.status(500).send('Error!') }) // Set the body size limit to 100 bytes @@ -41,18 +33,18 @@ let products = [{"name":"television", "price":112.34, "brand":"samsung"}, // handle get request for path / -app.get('/', (req, res) => { - res.send('response for GET request'); +app.get('/', (request, response) => { + response.send('response for GET request'); }); // handle get request for path /products -app.get('/products', (req, res) => { +app.get('/products', (request, response) => { - res.json(products); + response.json(products); }); // handle get request for path /products -app.get('/products/:brand', (req, res) => { +app.get('/products/:brand', (request, response) => { const brand = req.params.brand; @@ -60,11 +52,11 @@ app.get('/products/:brand', (req, res) => { const productsFiltered = products.filter(product=> product.brand == brand); - res.json(productsFiltered); + response.json(productsFiltered); }); // handle post request for path /products -app.post('/products', requireJsonContent, (req, res) => { +app.post('/products', requireJsonContent, (request, response) => { const products = []; const name = req.body.name ; @@ -76,31 +68,31 @@ app.post('/products', requireJsonContent, (req, res) => { products.push({name: req.body.name, brand: req.body.brand, price: req.body.price}); const productCreationResponse = {productID: "12345", result: "success"}; - res.json(productCreationResponse); + response.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()}) +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', (req, res, next) => { +app.get('/users', (request, response, next) => { console.log("Stage 1 processing "); next() }, -(req, res, next) => { +(request, response, next) => { console.log("Stage 2 processing "); next(); }, -(req, res) => { - res.send('response for GET request'); +(request, response) => { + response.send('response for GET request'); }); -app.get('/products/error', (req, res) => { +app.get('/products/error', (request, response) => { throw new Error("processing error!") }); // start the server diff --git a/node/express/getting-started/middleware.js b/node/express/getting-started/middleware.js index c51b197..0c92e74 100644 --- a/node/express/getting-started/middleware.js +++ b/node/express/getting-started/middleware.js @@ -1,13 +1,13 @@ // middleware.js -const requestLogger = (req, res, next) => { - console.log(req); +const requestLogger = (request, response, next) => { + console.log(request); next(); }; -const requireJsonContent = (req, res, next) => { - if (req.headers['content-type'] !== 'application/json') { - res.status(400).send('Server requires application/json') +const requireJsonContent = (request, response, next) => { + if (request.headers['content-type'] !== 'application/json') { + response.status(400).send('Server requires application/json') } else { next() } diff --git a/node/express/getting-started/package.json b/node/express/getting-started/package.json index 9ad7f4d..4fe54ed 100644 --- a/node/express/getting-started/package.json +++ b/node/express/getting-started/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "serve": "nodemon app.ts" }, "keywords": [], "author": "", @@ -12,5 +13,12 @@ "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" } } diff --git a/node/express/getting-started/routes.js b/node/express/getting-started/routes.js index 89a5550..97a4463 100644 --- a/node/express/getting-started/routes.js +++ b/node/express/getting-started/routes.js @@ -12,59 +12,60 @@ let products = [{"name":"television", "price":112.34, "brand":"samsung"}, {"name":"Macbook", "price": 3454.34, "brand": "Apple"}]; // handle get request for path /products -router.get('/products', (req, res) => { - res.json(products); +router.get('/products', (request, response) => { + console.log(products) + response.json(products) }); // handle get request for path /products -router.get('/products/:brand', (req, res) => { +router.get('/products/:brand', (request, response) => { - const brand = req.params.brand; + const brand = request.params.brand; console.log(`brand ${brand} `); const productsFiltered = products.filter(product=> product.brand == brand); - res.json(productsFiltered); + response.json(productsFiltered); }); // handle post request for path /products -router.post('/products', requireJsonContent,(req, res) => { +router.post('/products', requireJsonContent,(request, response) => { - const name = req.body.name ; + const name = request.body.name ; - const brand = req.body.brand; + const brand = request.body.brand; console.log(name + " " + brand); - products.push({name: req.body.name, brand: req.body.brand, price: req.body.price}); + products.push({name: request.body.name, brand: request.body.brand, price: request.body.price}); const productCreationResponse = {productID: "12345", result: "success"}; - res.json(productCreationResponse); + response.json(productCreationResponse); }); // handle put request for path /products -router.put('/products', (req, res) => { +router.put('/products', (request, response) => { - const name = req.body.name ; + const name = request.body.name ; - const brand = req.body.brand; + const brand = request.body.brand; console.log(name + " " + brand); - products.push({name: req.body.name, brand: req.body.brand, price: req.body.price}); + products.push({name: request.body.name, brand: request.body.brand, price: request.body.price}); const productCreationResponse = {productID: "12345", result: "success"}; - res.json(productCreationResponse); + response.json(productCreationResponse); }) -router.get('/home', (req, res) => { +router.get('/home', (request, response) => { console.log("rendering...") - res.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()}) + response.render("home", { title: "Home", message: "My home page" , sysdate: new Date().toLocaleString()}) }) -router.get('/productswitherror', (req, res) => { +router.get('/productswitherror', (request, response) => { let err = new Error("processing error ") err.statusCode = 400 throw err diff --git a/node/express/getting-started/tsconfig.json b/node/express/getting-started/tsconfig.json new file mode 100644 index 0000000..3cc5f3e --- /dev/null +++ b/node/express/getting-started/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "rootDir": "./", + "esModuleInterop": true + } + } \ No newline at end of file