├── .gitignore ├── schemas.js ├── package.json ├── middleware.js └── app.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /schemas.js: -------------------------------------------------------------------------------- 1 | const Joi = require('joi'); 2 | 3 | const schemas = { 4 | blogPOST: Joi.object().keys({ 5 | title: Joi.string().required(), 6 | description: Joi.string().required(), 7 | year: Joi.number() 8 | }), 9 | blogLIST: { 10 | page: Joi.number().required(), 11 | pageSize: Joi.number().required() 12 | }, 13 | blogDETAIL: { 14 | id: Joi.number().min(1).required() 15 | } 16 | }; 17 | 18 | module.exports = schemas; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "joi-example", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon app.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.18.3", 14 | "cors": "^2.8.5", 15 | "express": "^4.16.4", 16 | "joi": "^14.3.1", 17 | "nodemon": "^1.18.9" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /middleware.js: -------------------------------------------------------------------------------- 1 | const Joi = require('joi'); 2 | 3 | const middleware = (schema, property) => { 4 | return (req, res, next) => { 5 | 6 | const { error } = Joi.validate(req[property], schema); 7 | 8 | const valid = error == null; 9 | if (valid) { 10 | next(); 11 | } else { 12 | 13 | const { details } = error; 14 | const message = details.map(i => i.message).join(','); 15 | console.log("error", message); 16 | 17 | res.status(422).json({ 18 | error: message 19 | }) 20 | } 21 | } 22 | } 23 | 24 | module.exports = middleware; -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const cors = require('cors'); 3 | const app = express() 4 | const port = 3000 5 | 6 | const schemas = require('./schemas'); 7 | const middleware = require('./middleware'); 8 | 9 | var bodyParser = require("body-parser"); 10 | app.use(cors()); 11 | app.use(bodyParser.json()); 12 | 13 | app.get('/', (req, res) => res.send('Hello World!')) 14 | 15 | app.post('/blog', middleware(schemas.blogPOST, 'body') ,function (req, res) { 16 | console.log('/update'); 17 | 18 | res.json(req.body); 19 | }); 20 | 21 | app.get('/products', middleware(schemas.blogLIST, 'query'), function (req, res) { 22 | console.log('/products'); 23 | 24 | const { page, pageSize } = req.query; 25 | res.json(req.query); 26 | }); 27 | 28 | app.get('/products/:id', middleware(schemas.blogDETAIL, 'params'), function(req, res) { 29 | console.log("/products/:id"); 30 | const { id } = req.params; 31 | res.json(req.params); 32 | }) 33 | 34 | 35 | app.listen(port, () => console.log(`Example app listening on port ${port}!`)) 36 | 37 | --------------------------------------------------------------------------------