├── README.md └── project ├── controllers └── employeeController.js ├── models ├── db.js └── employee.model.js ├── package-lock.json ├── package.json ├── server.js └── views ├── employee ├── addOrEdit.hbs └── list.hbs └── layouts └── mainLayout.hbs /README.md: -------------------------------------------------------------------------------- 1 | # Node.js-Expess-MongoDB-CRUD 2 | 3 | Content discussed : 4 | - Form Design 5 | - Post Form Data into Node.js 6 | - Implemented Form Validation with mongoose model 7 | - Insert, Update and Delete with Node and MongoDB 8 | 9 | ## Get the Code 10 | 11 | ``` 12 | $ git clone https://github.com/CodAffection/Node.js-Expess-MongoDB-CRUD.git 13 | $ cd Node.js-Expess-MongoDB-CRUD/project 14 | $ npm install 15 | ``` 16 | 17 | ## How it works ? 18 | 19 | :tv: Video tutorial on this same topic 20 | Url : https://youtu.be/voDummz1gO0 21 | 22 | Video Tutorial for Node.js-Expess-MongoDB-CRUD 25 | 26 | 27 | | :bar_chart: | List of Tutorials | | :moneybag: | Support Us | 28 | |--------------------------:|:---------------------|---|---------------------:|:-------------------------------------| 29 | | Angular |http://bit.ly/2KQN9xF | |Paypal | https://goo.gl/bPcyXW | 30 | | Asp.Net Core |http://bit.ly/30fPDMg | |Amazon Affiliate | https://geni.us/JDzpE | 31 | | React |http://bit.ly/325temF | | 32 | | Python |http://bit.ly/2ws4utg | | :point_right: | Follow Us | 33 | | Node.js |https://goo.gl/viJcFs | |Website |http://www.codaffection.com | 34 | | Asp.Net MVC |https://goo.gl/gvjUJ7 | |YouTube |https://www.youtube.com/codaffection | 35 | | Flutter |https://bit.ly/3ggmmJz| |Facebook |https://www.facebook.com/codaffection | 36 | | Web API |https://goo.gl/itVayJ | |Twitter |https://twitter.com/CodAffection | 37 | | MEAN Stack |https://goo.gl/YJPPAH | | 38 | | C# Tutorial |https://goo.gl/s1zJxo | | 39 | | Asp.Net WebForm |https://goo.gl/GXC2aJ | | 40 | | C# WinForm |https://goo.gl/vHS9Hd | | 41 | | MS SQL |https://goo.gl/MLYS9e | | 42 | | Crystal Report |https://goo.gl/5Vou7t | | 43 | | CG Exercises in C Program |https://goo.gl/qEWJCs | | 44 | 45 | -------------------------------------------------------------------------------- /project/controllers/employeeController.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | var router = express.Router(); 3 | const mongoose = require('mongoose'); 4 | const Employee = mongoose.model('Employee'); 5 | 6 | router.get('/', (req, res) => { 7 | res.render("employee/addOrEdit", { 8 | viewTitle: "Insert Employee" 9 | }); 10 | }); 11 | 12 | router.post('/', (req, res) => { 13 | if (req.body._id == '') 14 | insertRecord(req, res); 15 | else 16 | updateRecord(req, res); 17 | }); 18 | 19 | 20 | function insertRecord(req, res) { 21 | var employee = new Employee(); 22 | employee.fullName = req.body.fullName; 23 | employee.email = req.body.email; 24 | employee.mobile = req.body.mobile; 25 | employee.city = req.body.city; 26 | employee.save((err, doc) => { 27 | if (!err) 28 | res.redirect('employee/list'); 29 | else { 30 | if (err.name == 'ValidationError') { 31 | handleValidationError(err, req.body); 32 | res.render("employee/addOrEdit", { 33 | viewTitle: "Insert Employee", 34 | employee: req.body 35 | }); 36 | } 37 | else 38 | console.log('Error during record insertion : ' + err); 39 | } 40 | }); 41 | } 42 | 43 | function updateRecord(req, res) { 44 | Employee.findOneAndUpdate({ _id: req.body._id }, req.body, { new: true }, (err, doc) => { 45 | if (!err) { res.redirect('employee/list'); } 46 | else { 47 | if (err.name == 'ValidationError') { 48 | handleValidationError(err, req.body); 49 | res.render("employee/addOrEdit", { 50 | viewTitle: 'Update Employee', 51 | employee: req.body 52 | }); 53 | } 54 | else 55 | console.log('Error during record update : ' + err); 56 | } 57 | }); 58 | } 59 | 60 | 61 | router.get('/list', (req, res) => { 62 | Employee.find((err, docs) => { 63 | if (!err) { 64 | res.render("employee/list", { 65 | list: docs 66 | }); 67 | } 68 | else { 69 | console.log('Error in retrieving employee list :' + err); 70 | } 71 | }); 72 | }); 73 | 74 | 75 | function handleValidationError(err, body) { 76 | for (field in err.errors) { 77 | switch (err.errors[field].path) { 78 | case 'fullName': 79 | body['fullNameError'] = err.errors[field].message; 80 | break; 81 | case 'email': 82 | body['emailError'] = err.errors[field].message; 83 | break; 84 | default: 85 | break; 86 | } 87 | } 88 | } 89 | 90 | router.get('/:id', (req, res) => { 91 | Employee.findById(req.params.id, (err, doc) => { 92 | if (!err) { 93 | res.render("employee/addOrEdit", { 94 | viewTitle: "Update Employee", 95 | employee: doc 96 | }); 97 | } 98 | }); 99 | }); 100 | 101 | router.get('/delete/:id', (req, res) => { 102 | Employee.findByIdAndRemove(req.params.id, (err, doc) => { 103 | if (!err) { 104 | res.redirect('/employee/list'); 105 | } 106 | else { console.log('Error in employee delete :' + err); } 107 | }); 108 | }); 109 | 110 | module.exports = router; -------------------------------------------------------------------------------- /project/models/db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | mongoose.connect('mongodb://localhost:27017/EmployeeDB', { useNewUrlParser: true }, (err) => { 4 | if (!err) { console.log('MongoDB Connection Succeeded.') } 5 | else { console.log('Error in DB connection : ' + err) } 6 | }); 7 | 8 | require('./employee.model'); -------------------------------------------------------------------------------- /project/models/employee.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | var employeeSchema = new mongoose.Schema({ 4 | fullName: { 5 | type: String, 6 | required: 'This field is required.' 7 | }, 8 | email: { 9 | type: String 10 | }, 11 | mobile: { 12 | type: String 13 | }, 14 | city: { 15 | type: String 16 | } 17 | }); 18 | 19 | // Custom validation for email 20 | employeeSchema.path('email').validate((val) => { 21 | emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 22 | return emailRegex.test(val); 23 | }, 'Invalid e-mail.'); 24 | 25 | mongoose.model('Employee', employeeSchema); -------------------------------------------------------------------------------- /project/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "asap": { 22 | "version": "2.0.6", 23 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 24 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 25 | }, 26 | "async": { 27 | "version": "2.6.1", 28 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 29 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 30 | "requires": { 31 | "lodash": "^4.17.10" 32 | } 33 | }, 34 | "balanced-match": { 35 | "version": "1.0.0", 36 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 37 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 38 | }, 39 | "bluebird": { 40 | "version": "3.5.1", 41 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 42 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 43 | }, 44 | "body-parser": { 45 | "version": "1.18.3", 46 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 47 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 48 | "requires": { 49 | "bytes": "3.0.0", 50 | "content-type": "~1.0.4", 51 | "debug": "2.6.9", 52 | "depd": "~1.1.2", 53 | "http-errors": "~1.6.3", 54 | "iconv-lite": "0.4.23", 55 | "on-finished": "~2.3.0", 56 | "qs": "6.5.2", 57 | "raw-body": "2.3.3", 58 | "type-is": "~1.6.16" 59 | } 60 | }, 61 | "brace-expansion": { 62 | "version": "1.1.11", 63 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 64 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 65 | "requires": { 66 | "balanced-match": "^1.0.0", 67 | "concat-map": "0.0.1" 68 | } 69 | }, 70 | "bson": { 71 | "version": "1.0.9", 72 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", 73 | "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" 74 | }, 75 | "bytes": { 76 | "version": "3.0.0", 77 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 78 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 79 | }, 80 | "commander": { 81 | "version": "2.17.1", 82 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 83 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 84 | "optional": true 85 | }, 86 | "concat-map": { 87 | "version": "0.0.1", 88 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 89 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 90 | }, 91 | "content-disposition": { 92 | "version": "0.5.2", 93 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 94 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 95 | }, 96 | "content-type": { 97 | "version": "1.0.4", 98 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 99 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 100 | }, 101 | "cookie": { 102 | "version": "0.3.1", 103 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 104 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 105 | }, 106 | "cookie-signature": { 107 | "version": "1.0.6", 108 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 109 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 110 | }, 111 | "debug": { 112 | "version": "2.6.9", 113 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 114 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 115 | "requires": { 116 | "ms": "2.0.0" 117 | } 118 | }, 119 | "define-properties": { 120 | "version": "1.1.3", 121 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 122 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 123 | "requires": { 124 | "object-keys": "^1.0.12" 125 | } 126 | }, 127 | "depd": { 128 | "version": "1.1.2", 129 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 130 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 131 | }, 132 | "destroy": { 133 | "version": "1.0.4", 134 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 135 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 136 | }, 137 | "ee-first": { 138 | "version": "1.1.1", 139 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 140 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 141 | }, 142 | "encodeurl": { 143 | "version": "1.0.2", 144 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 145 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 146 | }, 147 | "escape-html": { 148 | "version": "1.0.3", 149 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 150 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 151 | }, 152 | "etag": { 153 | "version": "1.8.1", 154 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 155 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 156 | }, 157 | "express": { 158 | "version": "4.16.4", 159 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 160 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 161 | "requires": { 162 | "accepts": "~1.3.5", 163 | "array-flatten": "1.1.1", 164 | "body-parser": "1.18.3", 165 | "content-disposition": "0.5.2", 166 | "content-type": "~1.0.4", 167 | "cookie": "0.3.1", 168 | "cookie-signature": "1.0.6", 169 | "debug": "2.6.9", 170 | "depd": "~1.1.2", 171 | "encodeurl": "~1.0.2", 172 | "escape-html": "~1.0.3", 173 | "etag": "~1.8.1", 174 | "finalhandler": "1.1.1", 175 | "fresh": "0.5.2", 176 | "merge-descriptors": "1.0.1", 177 | "methods": "~1.1.2", 178 | "on-finished": "~2.3.0", 179 | "parseurl": "~1.3.2", 180 | "path-to-regexp": "0.1.7", 181 | "proxy-addr": "~2.0.4", 182 | "qs": "6.5.2", 183 | "range-parser": "~1.2.0", 184 | "safe-buffer": "5.1.2", 185 | "send": "0.16.2", 186 | "serve-static": "1.13.2", 187 | "setprototypeof": "1.1.0", 188 | "statuses": "~1.4.0", 189 | "type-is": "~1.6.16", 190 | "utils-merge": "1.0.1", 191 | "vary": "~1.1.2" 192 | }, 193 | "dependencies": { 194 | "statuses": { 195 | "version": "1.4.0", 196 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 197 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 198 | } 199 | } 200 | }, 201 | "express-handlebars": { 202 | "version": "3.0.0", 203 | "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.0.0.tgz", 204 | "integrity": "sha1-gKBwu4GbCeSvLKbQeA91zgXnXC8=", 205 | "requires": { 206 | "glob": "^6.0.4", 207 | "graceful-fs": "^4.1.2", 208 | "handlebars": "^4.0.5", 209 | "object.assign": "^4.0.3", 210 | "promise": "^7.0.0" 211 | } 212 | }, 213 | "finalhandler": { 214 | "version": "1.1.1", 215 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 216 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 217 | "requires": { 218 | "debug": "2.6.9", 219 | "encodeurl": "~1.0.2", 220 | "escape-html": "~1.0.3", 221 | "on-finished": "~2.3.0", 222 | "parseurl": "~1.3.2", 223 | "statuses": "~1.4.0", 224 | "unpipe": "~1.0.0" 225 | }, 226 | "dependencies": { 227 | "statuses": { 228 | "version": "1.4.0", 229 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 230 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 231 | } 232 | } 233 | }, 234 | "forwarded": { 235 | "version": "0.1.2", 236 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 237 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 238 | }, 239 | "fresh": { 240 | "version": "0.5.2", 241 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 242 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 243 | }, 244 | "function-bind": { 245 | "version": "1.1.1", 246 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 247 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 248 | }, 249 | "glob": { 250 | "version": "6.0.4", 251 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", 252 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", 253 | "requires": { 254 | "inflight": "^1.0.4", 255 | "inherits": "2", 256 | "minimatch": "2 || 3", 257 | "once": "^1.3.0", 258 | "path-is-absolute": "^1.0.0" 259 | } 260 | }, 261 | "graceful-fs": { 262 | "version": "4.1.11", 263 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 264 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 265 | }, 266 | "handlebars": { 267 | "version": "4.0.12", 268 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", 269 | "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", 270 | "requires": { 271 | "async": "^2.5.0", 272 | "optimist": "^0.6.1", 273 | "source-map": "^0.6.1", 274 | "uglify-js": "^3.1.4" 275 | } 276 | }, 277 | "has-symbols": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 280 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 281 | }, 282 | "http-errors": { 283 | "version": "1.6.3", 284 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 285 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 286 | "requires": { 287 | "depd": "~1.1.2", 288 | "inherits": "2.0.3", 289 | "setprototypeof": "1.1.0", 290 | "statuses": ">= 1.4.0 < 2" 291 | } 292 | }, 293 | "iconv-lite": { 294 | "version": "0.4.23", 295 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 296 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 297 | "requires": { 298 | "safer-buffer": ">= 2.1.2 < 3" 299 | } 300 | }, 301 | "inflight": { 302 | "version": "1.0.6", 303 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 304 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 305 | "requires": { 306 | "once": "^1.3.0", 307 | "wrappy": "1" 308 | } 309 | }, 310 | "inherits": { 311 | "version": "2.0.3", 312 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 313 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 314 | }, 315 | "ipaddr.js": { 316 | "version": "1.8.0", 317 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 318 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 319 | }, 320 | "kareem": { 321 | "version": "2.3.0", 322 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", 323 | "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" 324 | }, 325 | "lodash": { 326 | "version": "4.17.11", 327 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 328 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 329 | }, 330 | "lodash.get": { 331 | "version": "4.4.2", 332 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 333 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 334 | }, 335 | "media-typer": { 336 | "version": "0.3.0", 337 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 338 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 339 | }, 340 | "memory-pager": { 341 | "version": "1.1.0", 342 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", 343 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", 344 | "optional": true 345 | }, 346 | "merge-descriptors": { 347 | "version": "1.0.1", 348 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 349 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 350 | }, 351 | "methods": { 352 | "version": "1.1.2", 353 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 354 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 355 | }, 356 | "mime": { 357 | "version": "1.4.1", 358 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 359 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 360 | }, 361 | "mime-db": { 362 | "version": "1.37.0", 363 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 364 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 365 | }, 366 | "mime-types": { 367 | "version": "2.1.21", 368 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 369 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 370 | "requires": { 371 | "mime-db": "~1.37.0" 372 | } 373 | }, 374 | "minimatch": { 375 | "version": "3.0.4", 376 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 377 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 378 | "requires": { 379 | "brace-expansion": "^1.1.7" 380 | } 381 | }, 382 | "minimist": { 383 | "version": "0.0.10", 384 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 385 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 386 | }, 387 | "mongodb": { 388 | "version": "3.1.6", 389 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.6.tgz", 390 | "integrity": "sha512-E5QJuXQoMlT7KyCYqNNMfAkhfQD79AT4F8Xd+6x37OX+8BL17GyXyWvfm6wuyx4wnzCCPoCSLeMeUN2S7dU9yw==", 391 | "requires": { 392 | "mongodb-core": "3.1.5", 393 | "safe-buffer": "^5.1.2" 394 | } 395 | }, 396 | "mongodb-core": { 397 | "version": "3.1.5", 398 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.5.tgz", 399 | "integrity": "sha512-emT/tM4ZBinqd6RZok+EzDdtN4LjYJIckv71qQVOEFmvXgT5cperZegVmTgox/1cx4XQu6LJ5ZuIwipP/eKdQg==", 400 | "requires": { 401 | "bson": "^1.1.0", 402 | "require_optional": "^1.0.1", 403 | "safe-buffer": "^5.1.2", 404 | "saslprep": "^1.0.0" 405 | }, 406 | "dependencies": { 407 | "bson": { 408 | "version": "1.1.0", 409 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", 410 | "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" 411 | } 412 | } 413 | }, 414 | "mongoose": { 415 | "version": "5.3.4", 416 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.3.4.tgz", 417 | "integrity": "sha512-DIUWOyYgZv2zGi/BoFEaFiaCVuDonnzGhW3cnc3JFjBScYn6z24tS2j3VB0dtMoX8FFjxmmMVnlmHPEIbV4PKA==", 418 | "requires": { 419 | "async": "2.6.1", 420 | "bson": "~1.0.5", 421 | "kareem": "2.3.0", 422 | "lodash.get": "4.4.2", 423 | "mongodb": "3.1.6", 424 | "mongodb-core": "3.1.5", 425 | "mongoose-legacy-pluralize": "1.0.2", 426 | "mpath": "0.5.1", 427 | "mquery": "3.2.0", 428 | "ms": "2.0.0", 429 | "regexp-clone": "0.0.1", 430 | "safe-buffer": "5.1.2", 431 | "sliced": "1.0.1" 432 | } 433 | }, 434 | "mongoose-legacy-pluralize": { 435 | "version": "1.0.2", 436 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 437 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 438 | }, 439 | "mpath": { 440 | "version": "0.5.1", 441 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", 442 | "integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==" 443 | }, 444 | "mquery": { 445 | "version": "3.2.0", 446 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz", 447 | "integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==", 448 | "requires": { 449 | "bluebird": "3.5.1", 450 | "debug": "3.1.0", 451 | "regexp-clone": "0.0.1", 452 | "safe-buffer": "5.1.2", 453 | "sliced": "1.0.1" 454 | }, 455 | "dependencies": { 456 | "debug": { 457 | "version": "3.1.0", 458 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 459 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 460 | "requires": { 461 | "ms": "2.0.0" 462 | } 463 | } 464 | } 465 | }, 466 | "ms": { 467 | "version": "2.0.0", 468 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 469 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 470 | }, 471 | "negotiator": { 472 | "version": "0.6.1", 473 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 474 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 475 | }, 476 | "object-keys": { 477 | "version": "1.0.12", 478 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 479 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" 480 | }, 481 | "object.assign": { 482 | "version": "4.1.0", 483 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 484 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 485 | "requires": { 486 | "define-properties": "^1.1.2", 487 | "function-bind": "^1.1.1", 488 | "has-symbols": "^1.0.0", 489 | "object-keys": "^1.0.11" 490 | } 491 | }, 492 | "on-finished": { 493 | "version": "2.3.0", 494 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 495 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 496 | "requires": { 497 | "ee-first": "1.1.1" 498 | } 499 | }, 500 | "once": { 501 | "version": "1.4.0", 502 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 503 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 504 | "requires": { 505 | "wrappy": "1" 506 | } 507 | }, 508 | "optimist": { 509 | "version": "0.6.1", 510 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 511 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 512 | "requires": { 513 | "minimist": "~0.0.1", 514 | "wordwrap": "~0.0.2" 515 | } 516 | }, 517 | "parseurl": { 518 | "version": "1.3.2", 519 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 520 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 521 | }, 522 | "path-is-absolute": { 523 | "version": "1.0.1", 524 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 525 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 526 | }, 527 | "path-to-regexp": { 528 | "version": "0.1.7", 529 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 530 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 531 | }, 532 | "promise": { 533 | "version": "7.3.1", 534 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 535 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 536 | "requires": { 537 | "asap": "~2.0.3" 538 | } 539 | }, 540 | "proxy-addr": { 541 | "version": "2.0.4", 542 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 543 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 544 | "requires": { 545 | "forwarded": "~0.1.2", 546 | "ipaddr.js": "1.8.0" 547 | } 548 | }, 549 | "qs": { 550 | "version": "6.5.2", 551 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 552 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 553 | }, 554 | "range-parser": { 555 | "version": "1.2.0", 556 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 557 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 558 | }, 559 | "raw-body": { 560 | "version": "2.3.3", 561 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 562 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 563 | "requires": { 564 | "bytes": "3.0.0", 565 | "http-errors": "1.6.3", 566 | "iconv-lite": "0.4.23", 567 | "unpipe": "1.0.0" 568 | } 569 | }, 570 | "regexp-clone": { 571 | "version": "0.0.1", 572 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 573 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 574 | }, 575 | "require_optional": { 576 | "version": "1.0.1", 577 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 578 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 579 | "requires": { 580 | "resolve-from": "^2.0.0", 581 | "semver": "^5.1.0" 582 | } 583 | }, 584 | "resolve-from": { 585 | "version": "2.0.0", 586 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 587 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 588 | }, 589 | "safe-buffer": { 590 | "version": "5.1.2", 591 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 592 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 593 | }, 594 | "safer-buffer": { 595 | "version": "2.1.2", 596 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 597 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 598 | }, 599 | "saslprep": { 600 | "version": "1.0.2", 601 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", 602 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", 603 | "optional": true, 604 | "requires": { 605 | "sparse-bitfield": "^3.0.3" 606 | } 607 | }, 608 | "semver": { 609 | "version": "5.6.0", 610 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 611 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 612 | }, 613 | "send": { 614 | "version": "0.16.2", 615 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 616 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 617 | "requires": { 618 | "debug": "2.6.9", 619 | "depd": "~1.1.2", 620 | "destroy": "~1.0.4", 621 | "encodeurl": "~1.0.2", 622 | "escape-html": "~1.0.3", 623 | "etag": "~1.8.1", 624 | "fresh": "0.5.2", 625 | "http-errors": "~1.6.2", 626 | "mime": "1.4.1", 627 | "ms": "2.0.0", 628 | "on-finished": "~2.3.0", 629 | "range-parser": "~1.2.0", 630 | "statuses": "~1.4.0" 631 | }, 632 | "dependencies": { 633 | "statuses": { 634 | "version": "1.4.0", 635 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 636 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 637 | } 638 | } 639 | }, 640 | "serve-static": { 641 | "version": "1.13.2", 642 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 643 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 644 | "requires": { 645 | "encodeurl": "~1.0.2", 646 | "escape-html": "~1.0.3", 647 | "parseurl": "~1.3.2", 648 | "send": "0.16.2" 649 | } 650 | }, 651 | "setprototypeof": { 652 | "version": "1.1.0", 653 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 654 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 655 | }, 656 | "sliced": { 657 | "version": "1.0.1", 658 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 659 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 660 | }, 661 | "source-map": { 662 | "version": "0.6.1", 663 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 664 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 665 | }, 666 | "sparse-bitfield": { 667 | "version": "3.0.3", 668 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 669 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 670 | "optional": true, 671 | "requires": { 672 | "memory-pager": "^1.0.2" 673 | } 674 | }, 675 | "statuses": { 676 | "version": "1.5.0", 677 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 678 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 679 | }, 680 | "type-is": { 681 | "version": "1.6.16", 682 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 683 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 684 | "requires": { 685 | "media-typer": "0.3.0", 686 | "mime-types": "~2.1.18" 687 | } 688 | }, 689 | "uglify-js": { 690 | "version": "3.4.9", 691 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 692 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 693 | "optional": true, 694 | "requires": { 695 | "commander": "~2.17.1", 696 | "source-map": "~0.6.1" 697 | } 698 | }, 699 | "unpipe": { 700 | "version": "1.0.0", 701 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 702 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 703 | }, 704 | "utils-merge": { 705 | "version": "1.0.1", 706 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 707 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 708 | }, 709 | "vary": { 710 | "version": "1.1.2", 711 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 712 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 713 | }, 714 | "wordwrap": { 715 | "version": "0.0.3", 716 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 717 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 718 | }, 719 | "wrappy": { 720 | "version": "1.0.2", 721 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 722 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 723 | } 724 | } 725 | } 726 | -------------------------------------------------------------------------------- /project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.18.3", 13 | "express": "^4.16.4", 14 | "express-handlebars": "^3.0.0", 15 | "mongoose": "^5.3.4" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /project/server.js: -------------------------------------------------------------------------------- 1 | require('./models/db'); 2 | 3 | const express = require('express'); 4 | const path = require('path'); 5 | const exphbs = require('express-handlebars'); 6 | const bodyparser = require('body-parser'); 7 | 8 | const employeeController = require('./controllers/employeeController'); 9 | 10 | var app = express(); 11 | app.use(bodyparser.urlencoded({ 12 | extended: true 13 | })); 14 | app.use(bodyparser.json()); 15 | app.set('views', path.join(__dirname, '/views/')); 16 | app.engine('hbs', exphbs({ extname: 'hbs', defaultLayout: 'mainLayout', layoutsDir: __dirname + '/views/layouts/' })); 17 | app.set('view engine', 'hbs'); 18 | 19 | app.listen(3000, () => { 20 | console.log('Express server started at port : 3000'); 21 | }); 22 | 23 | app.use('/employee', employeeController); -------------------------------------------------------------------------------- /project/views/employee/addOrEdit.hbs: -------------------------------------------------------------------------------- 1 |

{{viewTitle}}

2 | 3 |
4 | 5 |
6 | 7 | 8 |
9 | {{employee.fullNameError}}
10 |
11 |
12 | 13 | 14 |
15 | {{employee.emailError}}
16 |
17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 |
26 |
27 |
28 | 29 | View All 30 |
31 |
-------------------------------------------------------------------------------- /project/views/employee/list.hbs: -------------------------------------------------------------------------------- 1 |

Create New Employee List

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{#each list}} 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | {{/each}} 25 | 26 |
Full NameEmailMobileCity
{{this.fullName}}{{this.email}}{{this.mobile}}{{this.city}} 20 | 21 | 22 |
-------------------------------------------------------------------------------- /project/views/layouts/mainLayout.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Node.js express mongDB CRUD 7 | 9 | 10 | 11 | 12 | 13 |
14 |
15 | {{{body}}} 16 |
17 |
18 | 19 | 20 | 21 | --------------------------------------------------------------------------------