├── .gitignore ├── README.md ├── assets └── fzf-mongo-find-connection-string.gif ├── mongo-Date-Comparison-with-current-date.js ├── mongo-ObjectId-reference-2 ├── README.md ├── app.js ├── bin │ └── www ├── models │ ├── Administer.js │ └── User.js ├── package-lock.json ├── package.json ├── public │ └── stylesheets │ │ └── style.css ├── routes │ └── users.js └── views │ ├── error.jade │ └── layout.jade ├── mongo-ObjectId-reference ├── README.md ├── app.js ├── bin │ └── www ├── models │ ├── Post.js │ └── User.js ├── package-lock.json ├── package.json ├── public │ └── stylesheets │ │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views │ ├── error.jade │ ├── index.jade │ └── layout.jade └── mongoose-dynamically-update-field-value-from-nested-ref-objects-with-async-await-or-then-using-lodash-to-reformat-mongo-data-before-sending.md /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | 23 | # Ignore docs files 24 | _gh_pages 25 | .ruby-version 26 | 27 | # Numerous always-ignore extensions 28 | *.diff 29 | *.err 30 | *.orig 31 | *.log 32 | *.rej 33 | *.swo 34 | *.swp 35 | *.zip 36 | *.vi 37 | *~ 38 | *.~lock* 39 | .~lock* 40 | 41 | # OS or Editor folders 42 | .DS_Store 43 | ._* 44 | Thumbs.db 45 | .cache 46 | .project 47 | .settings 48 | .tmproj 49 | *.esproj 50 | nbproject 51 | *.sublime-project 52 | *.sublime-workspace 53 | .idea 54 | 55 | # Komodo 56 | *.komodoproject 57 | .komodotools 58 | 59 | # grunt-html-validation 60 | validation-status.json 61 | validation-report.json 62 | 63 | # Folders to ignore 64 | node_modules 65 | Project-Note-PAUL 66 | .vscode 67 | 68 | # Ignore all logfiles and tempfiles. 69 | !/log/.keep 70 | /tmp 71 | /.gems 72 | 73 | CountDownTimer-Note.odt 74 | random-code-1.js 75 | random-code-2.js 76 | random-code-3.js 77 | performance-1.js 78 | 79 | #ignore file name ending in "-bkp.js" OR "-bkp.ts" OR "-bkp.py" or "-test.js" OR "-test.ts" in its name. So I will have to put "-test.js" at all files that is just for my development-time random testing code . 80 | **/*-bkp.js 81 | **/*-bkp.ts 82 | **/*-bkp.py 83 | **/*-test.js 84 | **/*-test.ts 85 | **/*-test.py 86 | **/*-test.ipynb 87 | **/*-test.md 88 | **/*-test.json 89 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repo is primarily to be used as a reference. Its a collection of some small MongoDB Snippets required on a daily basis. 2 | 3 | Each of the project here has its own README.md file detailing how to launch the project and the job achieved with that project. 4 | 5 | --- 6 | 7 | ### Mongo Shell Enhancements with Mongo-Hacker 8 | 9 | I highly recommend to install Mongo-Hacker. It provides neat enhancements for the Mongo Shell like syntax coloring and formatting by default (no need to append .pretty() anymore). There is much more to discover; just check out the documentation. 10 | 11 | --- 12 | 13 | ### fzf-Powered Shell History Search 14 | 15 | ``` 16 | sudo apt-get install fzf 17 | 18 | ``` 19 | 20 | [fzf](https://github.com/junegunn/fzf) is a really awesome command line tool for fuzzy-searching things like files and folders. But for me, the most powerful feature of fzf is to apply the fuzzy search to the shell history (via key bindings). When it comes to MongoDB, I use the fuzzy history search to quickly find the required mongo connection line to connect to a certain database. Just hit Ctrl-R and type “mongo databaseName/username/appName”. 21 | 22 | ![](assets/fzf-mongo-find-connection-string.gif) 23 | 24 | **Needless to say, that you should encrypt your disk when having passwords in the shell history file.** 25 | -------------------------------------------------------------------------------- /assets/fzf-mongo-find-connection-string.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohan-paul/mongodb-snippets/13daf984bcdee1f990c483728ba0a85565b611ab/assets/fzf-mongo-find-connection-string.gif -------------------------------------------------------------------------------- /mongo-Date-Comparison-with-current-date.js: -------------------------------------------------------------------------------- 1 | /* Problem Statement - I have to compare curent date-time with the one saved in mongo's ISO format for checking if a password-reset uid has expired. So if the 'resetPasswordExpires' is earlier than the current-time, I will consider that uid invalid. Normal checking was giving erroneous result. Here's the solution. 2 | 3 | CAUTIONARY NOTE - WHILE THIS CODE WORKS PERFECTLY IN A STANDALONE .js FILE, I HAVE HAD FEW CASES WITHIN AN ACTUAL APP, WHERE IT FAILED TO WORK 4 | */ 5 | 6 | const actualMongoDB_data = [ 7 | { 8 | "status" : "pending", 9 | "_id" : ObjectId("5c8fab3052373723e5a2a0f2"), 10 | "uid" : "2e55cc00-498a-11e9-85d3-3df872f29c7b", 11 | "resetPasswordExpires" : ISODate("2019-03-18T14:29:04.820Z") 12 | }, 13 | { 14 | "status" : "pending", 15 | "_id" : ObjectId("5c8fab9c52373723e5a2a0f3"), 16 | "uid" : "6ea1e910-498a-11e9-85d3-3df872f29c7b", 17 | "resetPasswordExpires" : ISODate("2019-03-18T14:30:52.693Z") 18 | }, 19 | { 20 | "status" : "pending", 21 | "_id" : ObjectId("5c8fabd6ec281d25536fb49f"), 22 | "uid" : "917be080-498a-11e9-ab80-5bd21f444459", 23 | "resetPasswordExpires" : ISODate("2019-03-18T15:31:50.665Z") 24 | }, 25 | { 26 | "status" : "pending", 27 | "_id" : ObjectId("5c8fad500256be2611d28c54"), 28 | "uid" : "72f98df0-498b-11e9-8097-fd83c313130d", 29 | "resetPasswordExpires" : ISODate("2019-03-18T15:38:08.975Z") 30 | } 31 | ] 32 | 33 | 34 | 35 | let localCurrentTime = new Date(Date.now()).toLocaleTimeString('en-IN'); 36 | 37 | let mongoTime = new Date("2019-03-18T15:38:08.975Z").toLocaleTimeString('en-IN') 38 | 39 | console.log(localCurrentTime); 40 | console.log(mongoTime); 41 | 42 | if (mongoTime < localCurrentTime) { 43 | console.log('LOWER'); 44 | } else { 45 | console.log('LATER'); 46 | } 47 | 48 | // Reading - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString 49 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/README.md: -------------------------------------------------------------------------------- 1 | Here the case is as below 2 | 3 | 1> The requirement of the app is that only users who has an administrative right should be able to Login to the app. 4 | 5 | 6 | 2> So the 2 mongodb models have a reference to each other through an ObjectId 7 | 8 | 3> And I can implemented this by sending the user.administer (which is an unique id i.e. the ObjectId ) with the token in the Login route. 9 | 10 | (The route for the login is not yet implemented in this app, but I am showing below the code which needs to be implemented in the auth route) 11 | 12 | 13 | 14 | ```js 15 | router.post("/login", function(req, res) { 16 | User.findOne( 17 | { 18 | username: req.body.username 19 | }, 20 | function(err, user) { 21 | if (err) { 22 | throw err; 23 | } else if (!user) { 24 | // console.log("Authentication failed. User not found."); 25 | // the case when the user does not exists at all in the database 26 | res.status(404).send({ 27 | success: false, 28 | msg: "Authentication failed. User not found." 29 | }); 30 | } else if (user) { 31 | // user exists but password does not match 32 | var validPassword = user.comparePassword(req.body.password); 33 | 34 | if (!validPassword) { 35 | // console.log("Authentication failed. Wrong Password"); 36 | res.status(401).send({ 37 | success: false, 38 | msg: "Authentication failed. Wrong Password" 39 | }); 40 | } else { 41 | // case when the user exists and password also matches 42 | // so now create a token 43 | var token = jwt.sign( 44 | { 45 | user: user.toJSON(), 46 | administer: user.administer 47 | }, 48 | settings.secret, 49 | { 50 | expiresIn: "4h" 51 | } 52 | ); 53 | 54 | // return the information including token as JSON 55 | res.json({ 56 | success: true, 57 | token: "JWT " + token 58 | }); 59 | } 60 | } 61 | } 62 | ); 63 | }); 64 | 65 | module.exports = router; 66 | ``` 67 | 68 | ## If I wanted to check the above mechanism of the auth route in a working Postman POST requst. 69 | 70 | A> First create a new user. So insert a new mongodb record for users, by running the below command (the below password is the hashed version of 123) 71 | 72 | ```js 73 | db.users.insert( 74 | { 75 | "username" : "p@gmail.com", 76 | "password" : "$2a$10$HyXCD5.4U/0CvZHq9SDQ0uxD12BQ46yVAHu18lRRVEQZB3uyHXgy." 77 | } 78 | ) 79 | ``` 80 | 81 | This will automatically assign an \_id field to the data by mongodb. Assume that to be "5bd983e4a18ceecf4bba3c48" 82 | 83 | So now running the `db.users.find().pretty()` command I will see the below. 84 | 85 | ``` 86 | { 87 | "_id" : ObjectId("5bd983e4a18ceecf4bba3c48"), 88 | "username" : "p@gmail.com", 89 | "password" : "$2a$10$HyXCD5.4U/0CvZHq9SDQ0uxD12BQ46yVAHu18lRRVEQZB3uyHXgy.", 90 | "__v" : 0 91 | } 92 | ``` 93 | 94 | B> Then with that \_id create a dummy-administer as this Adminster credentials should be validated during the sign-in process. Else should throw "Authentication failed. User does not have Administer Authority." 95 | 96 | ```js 97 | db.administer.insert({ 98 | "name": "test-administer-name", 99 | "key_contact": "5bd983e4a18ceecf4bba3c48" 100 | }) 101 | 102 | ``` 103 | 104 | So now running the `db.administer.find().pretty()` command I will see the below. 105 | 106 | ```js 107 | { 108 | "_id" : ObjectId("5bdaadc9ebae106aaa8ca247"), 109 | "name" : "test-administer-name", 110 | "key_contact" : "5bd983e4a18ceecf4bba3c48" 111 | } 112 | 113 | ``` 114 | 115 | C> And now I also need to associate this ObjectId of the Administer to the previously creaed user (whose \_id field is - "5bd983e4a18ceecf4bba3c48") - i.e. running command for inserting new attribute to an existing document in MongoDB 116 | 117 | 118 | Now I want to add another attribute or property to this 'user' document named 'administer' and given this attribute is of `Schema.Types.ObjectId` type in `user` collection, I have to add the corresponding `administer's \_id field to it as its value. So lets say that field is - "5bd983e4a18ceecf4bba3c48" 119 | 120 | 121 | 122 | So the command to add `administer` value is 123 | 124 | ``` 125 | db.users.update({'_id' : ObjectId("5bd983e4a18ceecf4bba3c48")}, 126 | {'$set' : {'administer' : "5bdaadc9ebae106aaa8ca247" }}) 127 | ``` 128 | 129 | So now, both the models (collections) will be linked to each other and running the `db.users.find().pretty()` command I will see the below with the "administer's" id properly populated. 130 | 131 | ```js 132 | { 133 | "_id" : ObjectId("5bd983e4a18ceecf4bba3c48"), 134 | "username" : "p@gmail.com", 135 | "password" : "$2a$10$HyXCD5.4U/0CvZHq9SDQ0uxD12BQ46yVAHu18lRRVEQZB3uyHXgy.", 136 | "__v" : 0, 137 | "administer" : "5bdaadc9ebae106aaa8ca247" 138 | } 139 | 140 | ``` -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/app.js: -------------------------------------------------------------------------------- 1 | var createError = require("http-errors"); 2 | var express = require("express"); 3 | var path = require("path"); 4 | var cookieParser = require("cookie-parser"); 5 | var logger = require("morgan"); 6 | const mongoose = require("mongoose"); 7 | 8 | var usersRouter = require("./routes/users"); 9 | 10 | var app = express(); 11 | 12 | const uri = "mongodb://localhost:27017/mongo-reference-2"; 13 | mongoose 14 | .connect(uri) 15 | .then(() => console.log("connection successful")) 16 | .catch(err => console.error(err)); 17 | 18 | // view engine setup 19 | app.set("views", path.join(__dirname, "views")); 20 | app.set("view engine", "jade"); 21 | 22 | app.use(logger("dev")); 23 | app.use(express.json()); 24 | app.use(express.urlencoded({ extended: false })); 25 | app.use(cookieParser()); 26 | app.use(express.static(path.join(__dirname, "public"))); 27 | 28 | app.use("/users", usersRouter); 29 | 30 | // catch 404 and forward to error handler 31 | app.use(function(req, res, next) { 32 | next(createError(404)); 33 | }); 34 | 35 | // error handler 36 | app.use(function(err, req, res, next) { 37 | // set locals, only providing error in development 38 | res.locals.message = err.message; 39 | res.locals.error = req.app.get("env") === "development" ? err : {}; 40 | 41 | // render the error page 42 | res.status(err.status || 500); 43 | res.render("error"); 44 | }); 45 | 46 | module.exports = app; -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('mongo-objectid-reference-2:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/models/Administer.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | const User = require('./User') 4 | 5 | 6 | let administerSchema = new Schema( 7 | { 8 | name: { type: String, required: true }, 9 | key_contact: { type: Schema.Types.ObjectId, ref: "User" } 10 | }, 11 | { 12 | // createdAt,updatedAt fields are automatically added into records 13 | timestamps: true 14 | } 15 | ); 16 | 17 | 18 | module.exports = mongoose.model("Administer", administerSchema); -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/models/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | const Administer = require('./Administer') 4 | 5 | const UserSchema = new Schema({ 6 | username: { 7 | type: String, 8 | unique: true, 9 | required: true 10 | }, 11 | password: { 12 | type: String, 13 | required: true 14 | }, 15 | administer: { 16 | type: Schema.Types.ObjectId, 17 | ref: "Administer" 18 | } 19 | }); -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mongo-objectid-reference-2", 3 | "version": "0.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 | "acorn": { 17 | "version": "2.7.0", 18 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 19 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 20 | }, 21 | "acorn-globals": { 22 | "version": "1.0.9", 23 | "resolved": "http://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 24 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 25 | "requires": { 26 | "acorn": "^2.1.0" 27 | } 28 | }, 29 | "align-text": { 30 | "version": "0.1.4", 31 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 32 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 33 | "requires": { 34 | "kind-of": "^3.0.2", 35 | "longest": "^1.0.1", 36 | "repeat-string": "^1.5.2" 37 | } 38 | }, 39 | "amdefine": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 42 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 43 | }, 44 | "array-flatten": { 45 | "version": "1.1.1", 46 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 47 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 48 | }, 49 | "asap": { 50 | "version": "1.0.0", 51 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 52 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 53 | }, 54 | "basic-auth": { 55 | "version": "2.0.1", 56 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 57 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 58 | "requires": { 59 | "safe-buffer": "5.1.2" 60 | } 61 | }, 62 | "bluebird": { 63 | "version": "3.5.1", 64 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 65 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 66 | }, 67 | "body-parser": { 68 | "version": "1.18.3", 69 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 70 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 71 | "requires": { 72 | "bytes": "3.0.0", 73 | "content-type": "~1.0.4", 74 | "debug": "2.6.9", 75 | "depd": "~1.1.2", 76 | "http-errors": "~1.6.3", 77 | "iconv-lite": "0.4.23", 78 | "on-finished": "~2.3.0", 79 | "qs": "6.5.2", 80 | "raw-body": "2.3.3", 81 | "type-is": "~1.6.16" 82 | } 83 | }, 84 | "bson": { 85 | "version": "1.1.4", 86 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", 87 | "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" 88 | }, 89 | "bytes": { 90 | "version": "3.0.0", 91 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 92 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 93 | }, 94 | "camelcase": { 95 | "version": "1.2.1", 96 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 97 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 98 | }, 99 | "center-align": { 100 | "version": "0.1.3", 101 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 102 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 103 | "requires": { 104 | "align-text": "^0.1.3", 105 | "lazy-cache": "^1.0.3" 106 | } 107 | }, 108 | "character-parser": { 109 | "version": "1.2.1", 110 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 111 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 112 | }, 113 | "clean-css": { 114 | "version": "3.4.28", 115 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 116 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 117 | "requires": { 118 | "commander": "2.8.x", 119 | "source-map": "0.4.x" 120 | }, 121 | "dependencies": { 122 | "commander": { 123 | "version": "2.8.1", 124 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 125 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 126 | "requires": { 127 | "graceful-readlink": ">= 1.0.0" 128 | } 129 | } 130 | } 131 | }, 132 | "cliui": { 133 | "version": "2.1.0", 134 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 135 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 136 | "requires": { 137 | "center-align": "^0.1.1", 138 | "right-align": "^0.1.1", 139 | "wordwrap": "0.0.2" 140 | }, 141 | "dependencies": { 142 | "wordwrap": { 143 | "version": "0.0.2", 144 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 145 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 146 | } 147 | } 148 | }, 149 | "commander": { 150 | "version": "2.6.0", 151 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 152 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 153 | }, 154 | "constantinople": { 155 | "version": "3.0.2", 156 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 157 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 158 | "requires": { 159 | "acorn": "^2.1.0" 160 | } 161 | }, 162 | "content-disposition": { 163 | "version": "0.5.2", 164 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 165 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 166 | }, 167 | "content-type": { 168 | "version": "1.0.4", 169 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 170 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 171 | }, 172 | "cookie": { 173 | "version": "0.3.1", 174 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 175 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 176 | }, 177 | "cookie-parser": { 178 | "version": "1.4.3", 179 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", 180 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 181 | "requires": { 182 | "cookie": "0.3.1", 183 | "cookie-signature": "1.0.6" 184 | } 185 | }, 186 | "cookie-signature": { 187 | "version": "1.0.6", 188 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 189 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 190 | }, 191 | "css": { 192 | "version": "1.0.8", 193 | "resolved": "http://registry.npmjs.org/css/-/css-1.0.8.tgz", 194 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 195 | "requires": { 196 | "css-parse": "1.0.4", 197 | "css-stringify": "1.0.5" 198 | } 199 | }, 200 | "css-parse": { 201 | "version": "1.0.4", 202 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 203 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 204 | }, 205 | "css-stringify": { 206 | "version": "1.0.5", 207 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 208 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 209 | }, 210 | "debug": { 211 | "version": "2.6.9", 212 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 213 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 214 | "requires": { 215 | "ms": "2.0.0" 216 | } 217 | }, 218 | "decamelize": { 219 | "version": "1.2.0", 220 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 221 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 222 | }, 223 | "depd": { 224 | "version": "1.1.2", 225 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 226 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 227 | }, 228 | "destroy": { 229 | "version": "1.0.4", 230 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 231 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 232 | }, 233 | "ee-first": { 234 | "version": "1.1.1", 235 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 236 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 237 | }, 238 | "encodeurl": { 239 | "version": "1.0.2", 240 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 241 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 242 | }, 243 | "escape-html": { 244 | "version": "1.0.3", 245 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 246 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 247 | }, 248 | "etag": { 249 | "version": "1.8.1", 250 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 251 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 252 | }, 253 | "express": { 254 | "version": "4.16.4", 255 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 256 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 257 | "requires": { 258 | "accepts": "~1.3.5", 259 | "array-flatten": "1.1.1", 260 | "body-parser": "1.18.3", 261 | "content-disposition": "0.5.2", 262 | "content-type": "~1.0.4", 263 | "cookie": "0.3.1", 264 | "cookie-signature": "1.0.6", 265 | "debug": "2.6.9", 266 | "depd": "~1.1.2", 267 | "encodeurl": "~1.0.2", 268 | "escape-html": "~1.0.3", 269 | "etag": "~1.8.1", 270 | "finalhandler": "1.1.1", 271 | "fresh": "0.5.2", 272 | "merge-descriptors": "1.0.1", 273 | "methods": "~1.1.2", 274 | "on-finished": "~2.3.0", 275 | "parseurl": "~1.3.2", 276 | "path-to-regexp": "0.1.7", 277 | "proxy-addr": "~2.0.4", 278 | "qs": "6.5.2", 279 | "range-parser": "~1.2.0", 280 | "safe-buffer": "5.1.2", 281 | "send": "0.16.2", 282 | "serve-static": "1.13.2", 283 | "setprototypeof": "1.1.0", 284 | "statuses": "~1.4.0", 285 | "type-is": "~1.6.16", 286 | "utils-merge": "1.0.1", 287 | "vary": "~1.1.2" 288 | } 289 | }, 290 | "finalhandler": { 291 | "version": "1.1.1", 292 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 293 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 294 | "requires": { 295 | "debug": "2.6.9", 296 | "encodeurl": "~1.0.2", 297 | "escape-html": "~1.0.3", 298 | "on-finished": "~2.3.0", 299 | "parseurl": "~1.3.2", 300 | "statuses": "~1.4.0", 301 | "unpipe": "~1.0.0" 302 | } 303 | }, 304 | "forwarded": { 305 | "version": "0.1.2", 306 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 307 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 308 | }, 309 | "fresh": { 310 | "version": "0.5.2", 311 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 312 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 313 | }, 314 | "graceful-readlink": { 315 | "version": "1.0.1", 316 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 317 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 318 | }, 319 | "http-errors": { 320 | "version": "1.6.3", 321 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 322 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 323 | "requires": { 324 | "depd": "~1.1.2", 325 | "inherits": "2.0.3", 326 | "setprototypeof": "1.1.0", 327 | "statuses": ">= 1.4.0 < 2" 328 | } 329 | }, 330 | "iconv-lite": { 331 | "version": "0.4.23", 332 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 333 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 334 | "requires": { 335 | "safer-buffer": ">= 2.1.2 < 3" 336 | } 337 | }, 338 | "inherits": { 339 | "version": "2.0.3", 340 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 341 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 342 | }, 343 | "ipaddr.js": { 344 | "version": "1.8.0", 345 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 346 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 347 | }, 348 | "is-buffer": { 349 | "version": "1.1.6", 350 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 351 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 352 | }, 353 | "is-promise": { 354 | "version": "2.1.0", 355 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 356 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 357 | }, 358 | "jade": { 359 | "version": "1.11.0", 360 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 361 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 362 | "requires": { 363 | "character-parser": "1.2.1", 364 | "clean-css": "^3.1.9", 365 | "commander": "~2.6.0", 366 | "constantinople": "~3.0.1", 367 | "jstransformer": "0.0.2", 368 | "mkdirp": "~0.5.0", 369 | "transformers": "2.1.0", 370 | "uglify-js": "^2.4.19", 371 | "void-elements": "~2.0.1", 372 | "with": "~4.0.0" 373 | } 374 | }, 375 | "jstransformer": { 376 | "version": "0.0.2", 377 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 378 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 379 | "requires": { 380 | "is-promise": "^2.0.0", 381 | "promise": "^6.0.1" 382 | } 383 | }, 384 | "kareem": { 385 | "version": "2.3.1", 386 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 387 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 388 | }, 389 | "kind-of": { 390 | "version": "3.2.2", 391 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 392 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 393 | "requires": { 394 | "is-buffer": "^1.1.5" 395 | } 396 | }, 397 | "lazy-cache": { 398 | "version": "1.0.4", 399 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 400 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 401 | }, 402 | "longest": { 403 | "version": "1.0.1", 404 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 405 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 406 | }, 407 | "media-typer": { 408 | "version": "0.3.0", 409 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 410 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 411 | }, 412 | "merge-descriptors": { 413 | "version": "1.0.1", 414 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 415 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 416 | }, 417 | "methods": { 418 | "version": "1.1.2", 419 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 420 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 421 | }, 422 | "mime": { 423 | "version": "1.4.1", 424 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 425 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 426 | }, 427 | "mime-db": { 428 | "version": "1.37.0", 429 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 430 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 431 | }, 432 | "mime-types": { 433 | "version": "2.1.21", 434 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 435 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 436 | "requires": { 437 | "mime-db": "~1.37.0" 438 | } 439 | }, 440 | "minimist": { 441 | "version": "0.0.8", 442 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 443 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 444 | }, 445 | "mkdirp": { 446 | "version": "0.5.1", 447 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 448 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 449 | "requires": { 450 | "minimist": "0.0.8" 451 | } 452 | }, 453 | "mongodb": { 454 | "version": "3.3.2", 455 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", 456 | "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", 457 | "requires": { 458 | "bson": "^1.1.1", 459 | "require_optional": "^1.0.1", 460 | "safe-buffer": "^5.1.2" 461 | } 462 | }, 463 | "mongoose": { 464 | "version": "5.7.5", 465 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.5.tgz", 466 | "integrity": "sha512-BZ4FxtnbTurc/wcm/hLltLdI4IDxo4nsE0D9q58YymTdZwreNzwO62CcjVtaHhmr8HmJtOInp2W/T12FZaMf8g==", 467 | "requires": { 468 | "bson": "~1.1.1", 469 | "kareem": "2.3.1", 470 | "mongodb": "3.3.2", 471 | "mongoose-legacy-pluralize": "1.0.2", 472 | "mpath": "0.6.0", 473 | "mquery": "3.2.2", 474 | "ms": "2.1.2", 475 | "regexp-clone": "1.0.0", 476 | "safe-buffer": "5.1.2", 477 | "sift": "7.0.1", 478 | "sliced": "1.0.1" 479 | }, 480 | "dependencies": { 481 | "ms": { 482 | "version": "2.1.2", 483 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 484 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 485 | } 486 | } 487 | }, 488 | "mongoose-legacy-pluralize": { 489 | "version": "1.0.2", 490 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 491 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 492 | }, 493 | "morgan": { 494 | "version": "1.9.1", 495 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 496 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 497 | "requires": { 498 | "basic-auth": "~2.0.0", 499 | "debug": "2.6.9", 500 | "depd": "~1.1.2", 501 | "on-finished": "~2.3.0", 502 | "on-headers": "~1.0.1" 503 | } 504 | }, 505 | "mpath": { 506 | "version": "0.6.0", 507 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", 508 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" 509 | }, 510 | "mquery": { 511 | "version": "3.2.2", 512 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 513 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 514 | "requires": { 515 | "bluebird": "3.5.1", 516 | "debug": "3.1.0", 517 | "regexp-clone": "^1.0.0", 518 | "safe-buffer": "5.1.2", 519 | "sliced": "1.0.1" 520 | }, 521 | "dependencies": { 522 | "debug": { 523 | "version": "3.1.0", 524 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 525 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 526 | "requires": { 527 | "ms": "2.0.0" 528 | } 529 | } 530 | } 531 | }, 532 | "ms": { 533 | "version": "2.0.0", 534 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 535 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 536 | }, 537 | "negotiator": { 538 | "version": "0.6.1", 539 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 540 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 541 | }, 542 | "on-finished": { 543 | "version": "2.3.0", 544 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 545 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 546 | "requires": { 547 | "ee-first": "1.1.1" 548 | } 549 | }, 550 | "on-headers": { 551 | "version": "1.0.1", 552 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 553 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 554 | }, 555 | "optimist": { 556 | "version": "0.3.7", 557 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 558 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 559 | "requires": { 560 | "wordwrap": "~0.0.2" 561 | } 562 | }, 563 | "parseurl": { 564 | "version": "1.3.2", 565 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 566 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 567 | }, 568 | "path-to-regexp": { 569 | "version": "0.1.7", 570 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 571 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 572 | }, 573 | "promise": { 574 | "version": "6.1.0", 575 | "resolved": "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 576 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 577 | "requires": { 578 | "asap": "~1.0.0" 579 | } 580 | }, 581 | "proxy-addr": { 582 | "version": "2.0.4", 583 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 584 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 585 | "requires": { 586 | "forwarded": "~0.1.2", 587 | "ipaddr.js": "1.8.0" 588 | } 589 | }, 590 | "qs": { 591 | "version": "6.5.2", 592 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 593 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 594 | }, 595 | "range-parser": { 596 | "version": "1.2.0", 597 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 598 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 599 | }, 600 | "raw-body": { 601 | "version": "2.3.3", 602 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 603 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 604 | "requires": { 605 | "bytes": "3.0.0", 606 | "http-errors": "1.6.3", 607 | "iconv-lite": "0.4.23", 608 | "unpipe": "1.0.0" 609 | } 610 | }, 611 | "regexp-clone": { 612 | "version": "1.0.0", 613 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 614 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 615 | }, 616 | "repeat-string": { 617 | "version": "1.6.1", 618 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 619 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 620 | }, 621 | "require_optional": { 622 | "version": "1.0.1", 623 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 624 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 625 | "requires": { 626 | "resolve-from": "^2.0.0", 627 | "semver": "^5.1.0" 628 | } 629 | }, 630 | "resolve-from": { 631 | "version": "2.0.0", 632 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 633 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 634 | }, 635 | "right-align": { 636 | "version": "0.1.3", 637 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 638 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 639 | "requires": { 640 | "align-text": "^0.1.1" 641 | } 642 | }, 643 | "safe-buffer": { 644 | "version": "5.1.2", 645 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 646 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 647 | }, 648 | "safer-buffer": { 649 | "version": "2.1.2", 650 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 651 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 652 | }, 653 | "semver": { 654 | "version": "5.7.1", 655 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 656 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 657 | }, 658 | "send": { 659 | "version": "0.16.2", 660 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 661 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 662 | "requires": { 663 | "debug": "2.6.9", 664 | "depd": "~1.1.2", 665 | "destroy": "~1.0.4", 666 | "encodeurl": "~1.0.2", 667 | "escape-html": "~1.0.3", 668 | "etag": "~1.8.1", 669 | "fresh": "0.5.2", 670 | "http-errors": "~1.6.2", 671 | "mime": "1.4.1", 672 | "ms": "2.0.0", 673 | "on-finished": "~2.3.0", 674 | "range-parser": "~1.2.0", 675 | "statuses": "~1.4.0" 676 | } 677 | }, 678 | "serve-static": { 679 | "version": "1.13.2", 680 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 681 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 682 | "requires": { 683 | "encodeurl": "~1.0.2", 684 | "escape-html": "~1.0.3", 685 | "parseurl": "~1.3.2", 686 | "send": "0.16.2" 687 | } 688 | }, 689 | "setprototypeof": { 690 | "version": "1.1.0", 691 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 692 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 693 | }, 694 | "sift": { 695 | "version": "7.0.1", 696 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 697 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 698 | }, 699 | "sliced": { 700 | "version": "1.0.1", 701 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 702 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 703 | }, 704 | "source-map": { 705 | "version": "0.4.4", 706 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 707 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 708 | "requires": { 709 | "amdefine": ">=0.0.4" 710 | } 711 | }, 712 | "statuses": { 713 | "version": "1.4.0", 714 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 715 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 716 | }, 717 | "transformers": { 718 | "version": "2.1.0", 719 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 720 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 721 | "requires": { 722 | "css": "~1.0.8", 723 | "promise": "~2.0", 724 | "uglify-js": "~2.2.5" 725 | }, 726 | "dependencies": { 727 | "is-promise": { 728 | "version": "1.0.1", 729 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 730 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 731 | }, 732 | "promise": { 733 | "version": "2.0.0", 734 | "resolved": "http://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 735 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 736 | "requires": { 737 | "is-promise": "~1" 738 | } 739 | }, 740 | "source-map": { 741 | "version": "0.1.43", 742 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 743 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 744 | "requires": { 745 | "amdefine": ">=0.0.4" 746 | } 747 | }, 748 | "uglify-js": { 749 | "version": "2.2.5", 750 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 751 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 752 | "requires": { 753 | "optimist": "~0.3.5", 754 | "source-map": "~0.1.7" 755 | } 756 | } 757 | } 758 | }, 759 | "type-is": { 760 | "version": "1.6.16", 761 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 762 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 763 | "requires": { 764 | "media-typer": "0.3.0", 765 | "mime-types": "~2.1.18" 766 | } 767 | }, 768 | "uglify-js": { 769 | "version": "2.8.29", 770 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 771 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 772 | "requires": { 773 | "source-map": "~0.5.1", 774 | "uglify-to-browserify": "~1.0.0", 775 | "yargs": "~3.10.0" 776 | }, 777 | "dependencies": { 778 | "source-map": { 779 | "version": "0.5.7", 780 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 781 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 782 | } 783 | } 784 | }, 785 | "uglify-to-browserify": { 786 | "version": "1.0.2", 787 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 788 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 789 | "optional": true 790 | }, 791 | "unpipe": { 792 | "version": "1.0.0", 793 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 794 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 795 | }, 796 | "utils-merge": { 797 | "version": "1.0.1", 798 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 799 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 800 | }, 801 | "vary": { 802 | "version": "1.1.2", 803 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 804 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 805 | }, 806 | "void-elements": { 807 | "version": "2.0.1", 808 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 809 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 810 | }, 811 | "window-size": { 812 | "version": "0.1.0", 813 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 814 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 815 | }, 816 | "with": { 817 | "version": "4.0.3", 818 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 819 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 820 | "requires": { 821 | "acorn": "^1.0.1", 822 | "acorn-globals": "^1.0.3" 823 | }, 824 | "dependencies": { 825 | "acorn": { 826 | "version": "1.2.2", 827 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 828 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 829 | } 830 | } 831 | }, 832 | "wordwrap": { 833 | "version": "0.0.3", 834 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 835 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 836 | }, 837 | "yargs": { 838 | "version": "3.10.0", 839 | "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 840 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 841 | "requires": { 842 | "camelcase": "^1.0.2", 843 | "cliui": "^2.1.0", 844 | "decamelize": "^1.0.0", 845 | "window-size": "0.1.0" 846 | } 847 | } 848 | } 849 | } 850 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mongo-objectid-reference-2", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "cookie-parser": "~1.4.3", 10 | "debug": "~2.6.9", 11 | "express": "~4.16.0", 12 | "http-errors": "~1.6.2", 13 | "jade": "~1.11.0", 14 | "morgan": "~1.9.0", 15 | "mongoose": "^5.7.5" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference-2/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/README.md: -------------------------------------------------------------------------------- 1 | This is an exercise to show how mongodb references another model with `mongoose.Schema.Types.ObjectId,` 2 | 3 | Just launch the project by doing `npm install` and then `npm start` 4 | 5 | It will not show anything significant in the browser or Postman as I am inputting all the necessary data to feed mongodb in the `./routes/users.js` file with `posts.save`. Also there is no `router.post` as I am not saving to mongo after a post request but directly as soon as the server starts and `./routes/users.js`file gets executed. 6 | 7 | So as soon as the server starts these data will be saved to mongodb and the output will be shown in the terminal. 8 | 9 | ``` 10 | mongo 11 | show dbs 12 | use mongo-reference 13 | show collections 14 | db.posts.find().pretty() 15 | ``` 16 | 17 | And it will show the below result 18 | 19 | ``` 20 | { 21 | "_id" : ObjectId("5bd9d560ce113b4a49d1530e"), 22 | "title" : "Hello World", 23 | "postedBy" : ObjectId("5bd9d560ce113b4a49d1530c"), 24 | "comments" : [ 25 | { 26 | "_id" : ObjectId("5bd9d560ce113b4a49d15310"), 27 | "text" : "Nice post!", 28 | "postedBy" : ObjectId("5bd9d560ce113b4a49d1530d") 29 | }, 30 | { 31 | "_id" : ObjectId("5bd9d560ce113b4a49d1530f"), 32 | "text" : "Thanks mate", 33 | "postedBy" : ObjectId("5bd9d560ce113b4a49d1530c") 34 | } 35 | ], 36 | "__v" : 0 37 | } 38 | ``` 39 | 40 | But to see the full query result which is the full document containing all Post references - it will be shown in the Terminal window where the server is running - because I am doing a `console.log()` here 41 | 42 | ```js 43 | [ 44 | { 45 | _id: "5bd9d560ce113b4a49d1530e", 46 | title: "Hello World", 47 | postedBy: { 48 | _id: "5bd9d560ce113b4a49d1530c", 49 | name: "Rohan", 50 | __v: 0 51 | }, 52 | comments: [ 53 | { 54 | _id: "5bd9d560ce113b4a49d15310", 55 | text: "Nice post!", 56 | postedBy: { 57 | _id: "5bd9d560ce113b4a49d1530d", 58 | name: "Paul", 59 | __v: 0 60 | } 61 | }, 62 | { 63 | _id: "5bd9d560ce113b4a49d1530f", 64 | text: "Thanks mate", 65 | postedBy: { 66 | _id: "5bd9d560ce113b4a49d1530c", 67 | name: "Rohan", 68 | __v: 0 69 | } 70 | } 71 | ], 72 | __v: 0 73 | } 74 | ]; 75 | ``` 76 | 77 | ## If I wanted to get the data from Postman 78 | 79 | #### A> Keep the 2 users (rohan and paul variables) in app.js - so they can be saved in mongo as soon as the app.js executes with server launching. 80 | 81 | #### B> Comment out `let post` declaration and `post.save` in app.js. 82 | 83 | #### C> Instead write the router.post function. 84 | 85 | ```js 86 | router.post("/", (req, res, next) => { 87 | var posts = new Post(req.body); 88 | posts.save((err, newPosts) => { 89 | if (err) return next(err); 90 | Post.find({}) 91 | .populate("postedBy") 92 | .populate("comments.postedBy") 93 | .exec((error, post) => { 94 | res.status(200).send(newPosts); 95 | }); 96 | }); 97 | }); 98 | 99 | ``` 100 | 101 | #### D> Go to Postman > Body Tab > select radio button ‘raw’ > and from the drop-down list select JSON (application / json ) and paste the following json data. 102 | 103 | ### NOTE - For getting the 2 users \_id I have to get it from mongo shell in Terminam by running `db.users.find().pretty()` 104 | 105 | ``` 106 | { 107 | "title": "Hello World", 108 | "postedBy": { 109 | "_id": "5bda95442983d541a9a2ea7e", 110 | "name": "Rohan" 111 | }, 112 | "comments": [ 113 | { 114 | "text": "Nice post!", 115 | "postedBy": { 116 | "_id": "5bda95442983d541a9a2ea7f", 117 | "name": "Paul" 118 | } 119 | }, 120 | { 121 | "text": "Thanks mate", 122 | "postedBy": { 123 | "_id": "5bda95442983d541a9a2ea7e", 124 | "name": "Rohan" 125 | } 126 | } 127 | ] 128 | } 129 | ``` 130 | 131 | #### E> And I will get back the following inside Postman's response panel, which is the result of the line `res.status(200).send(newPosts)` from the router.post and is the complete post document that was saved. And will match if I run `db.posts.find().pretty()` 132 | 133 | ```js 134 | { 135 | "_id": "5bda993d3bbec6452132e991", 136 | "title": "Hello World", 137 | "postedBy": "5bda99023bbec6452132e98f", 138 | "comments": [ 139 | { 140 | "_id": "5bda993d3bbec6452132e993", 141 | "text": "Nice post!", 142 | "postedBy": "5bda99023bbec6452132e990" 143 | }, 144 | { 145 | "_id": "5bda993d3bbec6452132e992", 146 | "text": "Thanks mate", 147 | "postedBy": "5bda99023bbec6452132e98f" 148 | } 149 | ], 150 | "__v": 0 151 | } 152 | ``` 153 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/app.js: -------------------------------------------------------------------------------- 1 | var createError = require("http-errors"); 2 | var express = require("express"); 3 | var path = require("path"); 4 | var cookieParser = require("cookie-parser"); 5 | var logger = require("morgan"); 6 | const mongoose = require("mongoose"); 7 | 8 | var indexRouter = require("./routes/index"); 9 | var usersRouter = require("./routes/users"); 10 | 11 | var app = express(); 12 | 13 | const uri = "mongodb://localhost:27017/mongo-reference"; 14 | mongoose 15 | .connect(uri) 16 | .then(() => console.log("connection successful")) 17 | .catch(err => console.error(err)); 18 | 19 | // view engine setup 20 | app.set("views", path.join(__dirname, "views")); 21 | app.set("view engine", "jade"); 22 | 23 | app.use(logger("dev")); 24 | app.use(express.json()); 25 | app.use(express.urlencoded({ extended: false })); 26 | app.use(cookieParser()); 27 | app.use(express.static(path.join(__dirname, "public"))); 28 | 29 | app.use("/", indexRouter); 30 | app.use("/users", usersRouter); 31 | 32 | // catch 404 and forward to error handler 33 | app.use(function(req, res, next) { 34 | next(createError(404)); 35 | }); 36 | 37 | // error handler 38 | app.use(function(err, req, res, next) { 39 | // set locals, only providing error in development 40 | res.locals.message = err.message; 41 | res.locals.error = req.app.get("env") === "development" ? err : {}; 42 | 43 | // render the error page 44 | res.status(err.status || 500); 45 | res.render("error"); 46 | }); 47 | 48 | module.exports = app; 49 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('example:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '5000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/models/Post.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | 4 | var PostSchema = new mongoose.Schema({ 5 | title: String, 6 | postedBy: { 7 | type: mongoose.Schema.Types.ObjectId, 8 | ref: "User" 9 | }, 10 | comments: [ 11 | { 12 | text: String, 13 | postedBy: { 14 | type: mongoose.Schema.Types.ObjectId, 15 | ref: "User" 16 | } 17 | } 18 | ] 19 | }); 20 | 21 | module.exports = mongoose.model("Post", PostSchema); 22 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/models/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const Schema = mongoose.Schema; 3 | const autopopulate = require("mongoose-autopopulate"); 4 | 5 | var UserSchema = new mongoose.Schema({ 6 | name: String 7 | }); 8 | 9 | module.exports = mongoose.model("User", UserSchema); 10 | 11 | /* I can use `db.users.insert` to add a new document (i.e. record ) into this users collection run the below in terminal like below 12 | 13 | db.users.insert( 14 | { 15 | "username" : "test-user-2" 16 | } 17 | ) 18 | 19 | */ -------------------------------------------------------------------------------- /mongo-ObjectId-reference/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.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 | "acorn": { 17 | "version": "2.7.0", 18 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 19 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 20 | }, 21 | "acorn-globals": { 22 | "version": "1.0.9", 23 | "resolved": "http://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 24 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 25 | "requires": { 26 | "acorn": "^2.1.0" 27 | } 28 | }, 29 | "align-text": { 30 | "version": "0.1.4", 31 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 32 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 33 | "requires": { 34 | "kind-of": "^3.0.2", 35 | "longest": "^1.0.1", 36 | "repeat-string": "^1.5.2" 37 | } 38 | }, 39 | "amdefine": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 42 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 43 | }, 44 | "array-flatten": { 45 | "version": "1.1.1", 46 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 47 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 48 | }, 49 | "asap": { 50 | "version": "1.0.0", 51 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 52 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 53 | }, 54 | "basic-auth": { 55 | "version": "2.0.1", 56 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 57 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 58 | "requires": { 59 | "safe-buffer": "5.1.2" 60 | } 61 | }, 62 | "bluebird": { 63 | "version": "3.5.1", 64 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 65 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 66 | }, 67 | "body-parser": { 68 | "version": "1.18.3", 69 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 70 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 71 | "requires": { 72 | "bytes": "3.0.0", 73 | "content-type": "~1.0.4", 74 | "debug": "2.6.9", 75 | "depd": "~1.1.2", 76 | "http-errors": "~1.6.3", 77 | "iconv-lite": "0.4.23", 78 | "on-finished": "~2.3.0", 79 | "qs": "6.5.2", 80 | "raw-body": "2.3.3", 81 | "type-is": "~1.6.16" 82 | } 83 | }, 84 | "bson": { 85 | "version": "1.1.4", 86 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", 87 | "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" 88 | }, 89 | "bytes": { 90 | "version": "3.0.0", 91 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 92 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 93 | }, 94 | "camelcase": { 95 | "version": "1.2.1", 96 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 97 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 98 | }, 99 | "center-align": { 100 | "version": "0.1.3", 101 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 102 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 103 | "requires": { 104 | "align-text": "^0.1.3", 105 | "lazy-cache": "^1.0.3" 106 | } 107 | }, 108 | "character-parser": { 109 | "version": "1.2.1", 110 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 111 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 112 | }, 113 | "clean-css": { 114 | "version": "3.4.28", 115 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 116 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 117 | "requires": { 118 | "commander": "2.8.x", 119 | "source-map": "0.4.x" 120 | }, 121 | "dependencies": { 122 | "commander": { 123 | "version": "2.8.1", 124 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 125 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 126 | "requires": { 127 | "graceful-readlink": ">= 1.0.0" 128 | } 129 | } 130 | } 131 | }, 132 | "cliui": { 133 | "version": "2.1.0", 134 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 135 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 136 | "requires": { 137 | "center-align": "^0.1.1", 138 | "right-align": "^0.1.1", 139 | "wordwrap": "0.0.2" 140 | }, 141 | "dependencies": { 142 | "wordwrap": { 143 | "version": "0.0.2", 144 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 145 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 146 | } 147 | } 148 | }, 149 | "commander": { 150 | "version": "2.6.0", 151 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 152 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 153 | }, 154 | "constantinople": { 155 | "version": "3.0.2", 156 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 157 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 158 | "requires": { 159 | "acorn": "^2.1.0" 160 | } 161 | }, 162 | "content-disposition": { 163 | "version": "0.5.2", 164 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 165 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 166 | }, 167 | "content-type": { 168 | "version": "1.0.4", 169 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 170 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 171 | }, 172 | "cookie": { 173 | "version": "0.3.1", 174 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 175 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 176 | }, 177 | "cookie-parser": { 178 | "version": "1.4.3", 179 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", 180 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 181 | "requires": { 182 | "cookie": "0.3.1", 183 | "cookie-signature": "1.0.6" 184 | } 185 | }, 186 | "cookie-signature": { 187 | "version": "1.0.6", 188 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 189 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 190 | }, 191 | "css": { 192 | "version": "1.0.8", 193 | "resolved": "http://registry.npmjs.org/css/-/css-1.0.8.tgz", 194 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 195 | "requires": { 196 | "css-parse": "1.0.4", 197 | "css-stringify": "1.0.5" 198 | } 199 | }, 200 | "css-parse": { 201 | "version": "1.0.4", 202 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 203 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 204 | }, 205 | "css-stringify": { 206 | "version": "1.0.5", 207 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 208 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 209 | }, 210 | "debug": { 211 | "version": "2.6.9", 212 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 213 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 214 | "requires": { 215 | "ms": "2.0.0" 216 | } 217 | }, 218 | "decamelize": { 219 | "version": "1.2.0", 220 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 221 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 222 | }, 223 | "depd": { 224 | "version": "1.1.2", 225 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 226 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 227 | }, 228 | "destroy": { 229 | "version": "1.0.4", 230 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 231 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 232 | }, 233 | "ee-first": { 234 | "version": "1.1.1", 235 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 236 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 237 | }, 238 | "encodeurl": { 239 | "version": "1.0.2", 240 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 241 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 242 | }, 243 | "escape-html": { 244 | "version": "1.0.3", 245 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 246 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 247 | }, 248 | "etag": { 249 | "version": "1.8.1", 250 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 251 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 252 | }, 253 | "express": { 254 | "version": "4.16.4", 255 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 256 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 257 | "requires": { 258 | "accepts": "~1.3.5", 259 | "array-flatten": "1.1.1", 260 | "body-parser": "1.18.3", 261 | "content-disposition": "0.5.2", 262 | "content-type": "~1.0.4", 263 | "cookie": "0.3.1", 264 | "cookie-signature": "1.0.6", 265 | "debug": "2.6.9", 266 | "depd": "~1.1.2", 267 | "encodeurl": "~1.0.2", 268 | "escape-html": "~1.0.3", 269 | "etag": "~1.8.1", 270 | "finalhandler": "1.1.1", 271 | "fresh": "0.5.2", 272 | "merge-descriptors": "1.0.1", 273 | "methods": "~1.1.2", 274 | "on-finished": "~2.3.0", 275 | "parseurl": "~1.3.2", 276 | "path-to-regexp": "0.1.7", 277 | "proxy-addr": "~2.0.4", 278 | "qs": "6.5.2", 279 | "range-parser": "~1.2.0", 280 | "safe-buffer": "5.1.2", 281 | "send": "0.16.2", 282 | "serve-static": "1.13.2", 283 | "setprototypeof": "1.1.0", 284 | "statuses": "~1.4.0", 285 | "type-is": "~1.6.16", 286 | "utils-merge": "1.0.1", 287 | "vary": "~1.1.2" 288 | } 289 | }, 290 | "finalhandler": { 291 | "version": "1.1.1", 292 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 293 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 294 | "requires": { 295 | "debug": "2.6.9", 296 | "encodeurl": "~1.0.2", 297 | "escape-html": "~1.0.3", 298 | "on-finished": "~2.3.0", 299 | "parseurl": "~1.3.2", 300 | "statuses": "~1.4.0", 301 | "unpipe": "~1.0.0" 302 | } 303 | }, 304 | "forwarded": { 305 | "version": "0.1.2", 306 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 307 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 308 | }, 309 | "fresh": { 310 | "version": "0.5.2", 311 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 312 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 313 | }, 314 | "graceful-readlink": { 315 | "version": "1.0.1", 316 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 317 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 318 | }, 319 | "http-errors": { 320 | "version": "1.6.3", 321 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 322 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 323 | "requires": { 324 | "depd": "~1.1.2", 325 | "inherits": "2.0.3", 326 | "setprototypeof": "1.1.0", 327 | "statuses": ">= 1.4.0 < 2" 328 | } 329 | }, 330 | "iconv-lite": { 331 | "version": "0.4.23", 332 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 333 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 334 | "requires": { 335 | "safer-buffer": ">= 2.1.2 < 3" 336 | } 337 | }, 338 | "inherits": { 339 | "version": "2.0.3", 340 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 341 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 342 | }, 343 | "ipaddr.js": { 344 | "version": "1.8.0", 345 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 346 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 347 | }, 348 | "is-buffer": { 349 | "version": "1.1.6", 350 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 351 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 352 | }, 353 | "is-promise": { 354 | "version": "2.1.0", 355 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 356 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 357 | }, 358 | "jade": { 359 | "version": "1.11.0", 360 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 361 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 362 | "requires": { 363 | "character-parser": "1.2.1", 364 | "clean-css": "^3.1.9", 365 | "commander": "~2.6.0", 366 | "constantinople": "~3.0.1", 367 | "jstransformer": "0.0.2", 368 | "mkdirp": "~0.5.0", 369 | "transformers": "2.1.0", 370 | "uglify-js": "^2.4.19", 371 | "void-elements": "~2.0.1", 372 | "with": "~4.0.0" 373 | } 374 | }, 375 | "jstransformer": { 376 | "version": "0.0.2", 377 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 378 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 379 | "requires": { 380 | "is-promise": "^2.0.0", 381 | "promise": "^6.0.1" 382 | } 383 | }, 384 | "kareem": { 385 | "version": "2.3.1", 386 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 387 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 388 | }, 389 | "kind-of": { 390 | "version": "3.2.2", 391 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 392 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 393 | "requires": { 394 | "is-buffer": "^1.1.5" 395 | } 396 | }, 397 | "lazy-cache": { 398 | "version": "1.0.4", 399 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 400 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 401 | }, 402 | "longest": { 403 | "version": "1.0.1", 404 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 405 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 406 | }, 407 | "media-typer": { 408 | "version": "0.3.0", 409 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 410 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 411 | }, 412 | "merge-descriptors": { 413 | "version": "1.0.1", 414 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 415 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 416 | }, 417 | "methods": { 418 | "version": "1.1.2", 419 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 420 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 421 | }, 422 | "mime": { 423 | "version": "1.4.1", 424 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 425 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 426 | }, 427 | "mime-db": { 428 | "version": "1.37.0", 429 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 430 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 431 | }, 432 | "mime-types": { 433 | "version": "2.1.21", 434 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 435 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 436 | "requires": { 437 | "mime-db": "~1.37.0" 438 | } 439 | }, 440 | "minimist": { 441 | "version": "0.0.8", 442 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 443 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 444 | }, 445 | "mkdirp": { 446 | "version": "0.5.1", 447 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 448 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 449 | "requires": { 450 | "minimist": "0.0.8" 451 | } 452 | }, 453 | "mongodb": { 454 | "version": "3.3.2", 455 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", 456 | "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", 457 | "requires": { 458 | "bson": "^1.1.1", 459 | "require_optional": "^1.0.1", 460 | "safe-buffer": "^5.1.2" 461 | } 462 | }, 463 | "mongoose": { 464 | "version": "5.7.5", 465 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.5.tgz", 466 | "integrity": "sha512-BZ4FxtnbTurc/wcm/hLltLdI4IDxo4nsE0D9q58YymTdZwreNzwO62CcjVtaHhmr8HmJtOInp2W/T12FZaMf8g==", 467 | "requires": { 468 | "bson": "~1.1.1", 469 | "kareem": "2.3.1", 470 | "mongodb": "3.3.2", 471 | "mongoose-legacy-pluralize": "1.0.2", 472 | "mpath": "0.6.0", 473 | "mquery": "3.2.2", 474 | "ms": "2.1.2", 475 | "regexp-clone": "1.0.0", 476 | "safe-buffer": "5.1.2", 477 | "sift": "7.0.1", 478 | "sliced": "1.0.1" 479 | }, 480 | "dependencies": { 481 | "ms": { 482 | "version": "2.1.2", 483 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 484 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 485 | } 486 | } 487 | }, 488 | "mongoose-autopopulate": { 489 | "version": "0.8.2", 490 | "resolved": "https://registry.npmjs.org/mongoose-autopopulate/-/mongoose-autopopulate-0.8.2.tgz", 491 | "integrity": "sha512-hrr1SQMYm1oLsKNuSFyWEPEMl3C6pWLJq8OKApsOxRRdOdIMnNDvSaXqJeD83zx4xffaDeVHVoxR29P560lmEQ==" 492 | }, 493 | "mongoose-legacy-pluralize": { 494 | "version": "1.0.2", 495 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 496 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 497 | }, 498 | "morgan": { 499 | "version": "1.9.1", 500 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 501 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 502 | "requires": { 503 | "basic-auth": "~2.0.0", 504 | "debug": "2.6.9", 505 | "depd": "~1.1.2", 506 | "on-finished": "~2.3.0", 507 | "on-headers": "~1.0.1" 508 | } 509 | }, 510 | "mpath": { 511 | "version": "0.6.0", 512 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", 513 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" 514 | }, 515 | "mquery": { 516 | "version": "3.2.2", 517 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 518 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 519 | "requires": { 520 | "bluebird": "3.5.1", 521 | "debug": "3.1.0", 522 | "regexp-clone": "^1.0.0", 523 | "safe-buffer": "5.1.2", 524 | "sliced": "1.0.1" 525 | }, 526 | "dependencies": { 527 | "debug": { 528 | "version": "3.1.0", 529 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 530 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 531 | "requires": { 532 | "ms": "2.0.0" 533 | } 534 | } 535 | } 536 | }, 537 | "ms": { 538 | "version": "2.0.0", 539 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 540 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 541 | }, 542 | "negotiator": { 543 | "version": "0.6.1", 544 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 545 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 546 | }, 547 | "on-finished": { 548 | "version": "2.3.0", 549 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 550 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 551 | "requires": { 552 | "ee-first": "1.1.1" 553 | } 554 | }, 555 | "on-headers": { 556 | "version": "1.0.1", 557 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 558 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 559 | }, 560 | "optimist": { 561 | "version": "0.3.7", 562 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 563 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 564 | "requires": { 565 | "wordwrap": "~0.0.2" 566 | } 567 | }, 568 | "parseurl": { 569 | "version": "1.3.2", 570 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 571 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 572 | }, 573 | "path-to-regexp": { 574 | "version": "0.1.7", 575 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 576 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 577 | }, 578 | "promise": { 579 | "version": "6.1.0", 580 | "resolved": "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 581 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 582 | "requires": { 583 | "asap": "~1.0.0" 584 | } 585 | }, 586 | "proxy-addr": { 587 | "version": "2.0.4", 588 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 589 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 590 | "requires": { 591 | "forwarded": "~0.1.2", 592 | "ipaddr.js": "1.8.0" 593 | } 594 | }, 595 | "qs": { 596 | "version": "6.5.2", 597 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 598 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 599 | }, 600 | "range-parser": { 601 | "version": "1.2.0", 602 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 603 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 604 | }, 605 | "raw-body": { 606 | "version": "2.3.3", 607 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 608 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 609 | "requires": { 610 | "bytes": "3.0.0", 611 | "http-errors": "1.6.3", 612 | "iconv-lite": "0.4.23", 613 | "unpipe": "1.0.0" 614 | } 615 | }, 616 | "regexp-clone": { 617 | "version": "1.0.0", 618 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 619 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 620 | }, 621 | "repeat-string": { 622 | "version": "1.6.1", 623 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 624 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 625 | }, 626 | "require_optional": { 627 | "version": "1.0.1", 628 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 629 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 630 | "requires": { 631 | "resolve-from": "^2.0.0", 632 | "semver": "^5.1.0" 633 | } 634 | }, 635 | "resolve-from": { 636 | "version": "2.0.0", 637 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 638 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 639 | }, 640 | "right-align": { 641 | "version": "0.1.3", 642 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 643 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 644 | "requires": { 645 | "align-text": "^0.1.1" 646 | } 647 | }, 648 | "safe-buffer": { 649 | "version": "5.1.2", 650 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 651 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 652 | }, 653 | "safer-buffer": { 654 | "version": "2.1.2", 655 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 656 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 657 | }, 658 | "semver": { 659 | "version": "5.7.1", 660 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 661 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 662 | }, 663 | "send": { 664 | "version": "0.16.2", 665 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 666 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 667 | "requires": { 668 | "debug": "2.6.9", 669 | "depd": "~1.1.2", 670 | "destroy": "~1.0.4", 671 | "encodeurl": "~1.0.2", 672 | "escape-html": "~1.0.3", 673 | "etag": "~1.8.1", 674 | "fresh": "0.5.2", 675 | "http-errors": "~1.6.2", 676 | "mime": "1.4.1", 677 | "ms": "2.0.0", 678 | "on-finished": "~2.3.0", 679 | "range-parser": "~1.2.0", 680 | "statuses": "~1.4.0" 681 | } 682 | }, 683 | "serve-static": { 684 | "version": "1.13.2", 685 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 686 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 687 | "requires": { 688 | "encodeurl": "~1.0.2", 689 | "escape-html": "~1.0.3", 690 | "parseurl": "~1.3.2", 691 | "send": "0.16.2" 692 | } 693 | }, 694 | "setprototypeof": { 695 | "version": "1.1.0", 696 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 697 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 698 | }, 699 | "sift": { 700 | "version": "7.0.1", 701 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 702 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 703 | }, 704 | "sliced": { 705 | "version": "1.0.1", 706 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 707 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 708 | }, 709 | "source-map": { 710 | "version": "0.4.4", 711 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 712 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 713 | "requires": { 714 | "amdefine": ">=0.0.4" 715 | } 716 | }, 717 | "statuses": { 718 | "version": "1.4.0", 719 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 720 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 721 | }, 722 | "transformers": { 723 | "version": "2.1.0", 724 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 725 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 726 | "requires": { 727 | "css": "~1.0.8", 728 | "promise": "~2.0", 729 | "uglify-js": "~2.2.5" 730 | }, 731 | "dependencies": { 732 | "is-promise": { 733 | "version": "1.0.1", 734 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 735 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 736 | }, 737 | "promise": { 738 | "version": "2.0.0", 739 | "resolved": "http://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 740 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 741 | "requires": { 742 | "is-promise": "~1" 743 | } 744 | }, 745 | "source-map": { 746 | "version": "0.1.43", 747 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 748 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 749 | "requires": { 750 | "amdefine": ">=0.0.4" 751 | } 752 | }, 753 | "uglify-js": { 754 | "version": "2.2.5", 755 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 756 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 757 | "requires": { 758 | "optimist": "~0.3.5", 759 | "source-map": "~0.1.7" 760 | } 761 | } 762 | } 763 | }, 764 | "type-is": { 765 | "version": "1.6.16", 766 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 767 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 768 | "requires": { 769 | "media-typer": "0.3.0", 770 | "mime-types": "~2.1.18" 771 | } 772 | }, 773 | "uglify-js": { 774 | "version": "2.8.29", 775 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 776 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 777 | "requires": { 778 | "source-map": "~0.5.1", 779 | "uglify-to-browserify": "~1.0.0", 780 | "yargs": "~3.10.0" 781 | }, 782 | "dependencies": { 783 | "source-map": { 784 | "version": "0.5.7", 785 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 786 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 787 | } 788 | } 789 | }, 790 | "uglify-to-browserify": { 791 | "version": "1.0.2", 792 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 793 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 794 | "optional": true 795 | }, 796 | "unpipe": { 797 | "version": "1.0.0", 798 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 799 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 800 | }, 801 | "utils-merge": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 804 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 805 | }, 806 | "vary": { 807 | "version": "1.1.2", 808 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 809 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 810 | }, 811 | "void-elements": { 812 | "version": "2.0.1", 813 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 814 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 815 | }, 816 | "window-size": { 817 | "version": "0.1.0", 818 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 819 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 820 | }, 821 | "with": { 822 | "version": "4.0.3", 823 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 824 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 825 | "requires": { 826 | "acorn": "^1.0.1", 827 | "acorn-globals": "^1.0.3" 828 | }, 829 | "dependencies": { 830 | "acorn": { 831 | "version": "1.2.2", 832 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 833 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 834 | } 835 | } 836 | }, 837 | "wordwrap": { 838 | "version": "0.0.3", 839 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 840 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 841 | }, 842 | "yargs": { 843 | "version": "3.10.0", 844 | "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 845 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 846 | "requires": { 847 | "camelcase": "^1.0.2", 848 | "cliui": "^2.1.0", 849 | "decamelize": "^1.0.0", 850 | "window-size": "0.1.0" 851 | } 852 | } 853 | } 854 | } 855 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "cookie-parser": "~1.4.3", 10 | "debug": "~2.6.9", 11 | "express": "~4.16.0", 12 | "http-errors": "~1.6.2", 13 | "jade": "~1.11.0", 14 | "mongoose": "^5.7.5", 15 | "morgan": "~1.9.0", 16 | "mongoose-autopopulate": "^0.8.2" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | res.render('index', { title: 'Express' }); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require("express"); 2 | var router = express.Router(); 3 | // const mongoose = require('mongoose'); 4 | const User = require("../models/User"); 5 | const Post = require("../models/Post"); 6 | 7 | // Manually creating two new users from the User model who will create and comment on posts 8 | let rohan = new User({ 9 | name: "Rohan" 10 | }); 11 | 12 | let paul = new User({ 13 | name: "Paul" 14 | }); 15 | 16 | rohan.save(); 17 | paul.save(); 18 | 19 | // Now create a post along with comments by the above two users 20 | // let post = new Post({ 21 | // title: "Hello World", 22 | // postedBy: rohan._id, 23 | // comments: [ 24 | // { 25 | // text: "Nice post!", 26 | // postedBy: paul._id 27 | // }, 28 | // { 29 | // text: "Thanks mate", 30 | // postedBy: rohan._id 31 | // } 32 | // ] 33 | // }); 34 | 35 | // post.save(err => { 36 | // if (err) return next(err); 37 | // Post.find({}) 38 | // .populate("postedBy") 39 | // .populate("comments.postedBy") 40 | // .exec((error, posts) => { 41 | // console.log(JSON.stringify(posts, null, "\t")); 42 | // }); 43 | // }); 44 | 45 | router.post("/", (req, res, next) => { 46 | var posts = new Post(req.body); 47 | posts.save((err, newPosts) => { 48 | if (err) return next(err); 49 | Post.find({}) 50 | .populate("postedBy") 51 | .populate("comments.postedBy") 52 | .exec((error, post) => { 53 | res.status(200).send(newPosts); 54 | }); 55 | }); 56 | }); 57 | 58 | module.exports = router; 59 | 60 | /* 61 | 62 | 63 | 64 | */ 65 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /mongo-ObjectId-reference/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /mongoose-dynamically-update-field-value-from-nested-ref-objects-with-async-await-or-then-using-lodash-to-reformat-mongo-data-before-sending.md: -------------------------------------------------------------------------------- 1 | #### Here I have the model/schema below. 2 | 3 | ##### ../IES-Rohan-WIP/server/routes/importRoutes.js 4 | 5 | #### My Import Model file 6 | 7 | ```js 8 | "use strict"; 9 | 10 | const mongoose = require("mongoose"), 11 | Commodity = require("./commodity"), 12 | autopopulate = require("mongoose-autopopulate"), 13 | Port = require("./port"), 14 | Schema = mongoose.Schema, 15 | mongoosePaginate = require("mongoose-paginate"); 16 | 17 | let importSchema = new Schema( 18 | { 19 | imported_commodity: { 20 | type: Schema.Types.ObjectId, 21 | ref: "Commodity", 22 | required: true, 23 | autopopulate: true 24 | }, 25 | imported_commodity_name: { type: String }, 26 | imported_date: { 27 | type: Date, 28 | default: Date.now 29 | }, 30 | // quantity in M.Tons 31 | qty_in_mts: { 32 | type: Number 33 | }, 34 | // no of vessel per day for imported_commodity 35 | no_of_vessels_per_day: { 36 | type: Number 37 | } 38 | }, 39 | { 40 | // createdAt,updatedAt fields are automatically added into records 41 | timestamps: true 42 | } 43 | ); 44 | // THE BELOW CODE WITH .pre hook WILL NOT WORK to fetch the 'imported_commodity.name' from the nested object of 'imported_commodity' as the 'imported_commodity' is just a pure string formatted object_id and not a full object, that I thought it would be (becasue with a GET request to the api, I was getting the 'imported_commodity' as a full object, but after only the POST request, I was getting the 'imported_commodity' as ONLY a singel objectId) 45 | 46 | // importSchema.pre("save", function(next) { 47 | // if (!this.imported_commodity_name) { 48 | // this.imported_commodity_name = this.imported_commodity.name; 49 | // } 50 | // next(); 51 | // }); 52 | 53 | // plugins 54 | importSchema.plugin(autopopulate); 55 | importSchema.plugin(mongoosePaginate); 56 | 57 | module.exports = mongoose.model("Import", importSchema); 58 | ``` 59 | 60 | ## THE PROBLEM 61 | 62 | #### When I send a POST request to add a new item to the schema, it should return me the following (below) in Postman as the new item added (See I have "imported_commodity_name": "silicon-12", as a top-lvel field that has been created in my backend routes file). The key requirement is, for the referenced Model (Commodity), I am passing only the ObjectId for the field 'imported_commodity' but in the returned data, I will need the field 'imported_commodity_name' as a separate top level field with data populated from the referenced Model 'Commodity' 63 | 64 | #### The reason I need this variable as a top-level field rather than as a nested object, is because of the sort functionality of Material-UI table. While I was able to render the table rows properly by fetching this value from the nested returned object. But the sort functionality's various util functions were becoming too uncontrollable without a top-level field value. 65 | 66 | #### Here's my Postman POST request body to the API - http://localhost:3000/api/imports 67 | 68 | ```js 69 | { 70 | "imported_commodity":"5c6121e4722f134f27c49ee4", 71 | "imported_date":"2019-02-13", 72 | "qty_in_mts":"89", 73 | "no_of_vessels_per_day":"299", 74 | "port": { 75 | "country": "India", 76 | "_id": "5bdaadc9ebae106aaa8ca247", 77 | "name": "test-port-name", 78 | "phone_number": 9120656259, 79 | "email": "test@gmail.com", 80 | "key_contact": "5bd983e4a18ceecf4bba3c48" 81 | } 82 | } 83 | ``` 84 | 85 | And here's the correct return from the POST request that I am expecting. 86 | 87 | ```js 88 | { 89 | "_id": "5c63e31a52cfb71e2f868f86", 90 | "imported_commodity": "5c6121e4722f134f27c49ee4", 91 | "imported_date": "2019-02-13T00:00:00.000Z", 92 | "qty_in_mts": 89, 93 | "no_of_vessels_per_day": 299, 94 | "port": "5bdaadc9ebae106aaa8ca247", 95 | "imported_commodity_name": "silicon-12", 96 | "createdAt": "2019-02-13T09:27:54.900Z", 97 | "updatedAt": "2019-02-13T09:27:54.900Z", 98 | "__v": 0 99 | } 100 | ``` 101 | 102 | The GET request was sending the below data (BEFORE IMPLEMENTING THE SOLUTION). As you can see in the GET request the "imported_commodity" is full nested object. 103 | 104 | ```js 105 | { 106 | "_id": "5c63e31a52cfb71e2f868f86", 107 | "imported_commodity": { 108 | "_id": "5c6121e4722f134f27c49ee4", 109 | "name": "silicon-12", 110 | "type": "Material", 111 | "createdAt": "2019-02-11T07:19:00.608Z", 112 | "updatedAt": "2019-02-12T14:21:43.478Z", 113 | "__v": 0 114 | }, 115 | "imported_date": "2019-02-13T00:00:00.000Z", 116 | "qty_in_mts": 89, 117 | "no_of_vessels_per_day": 299, 118 | "port": null, 119 | "createdAt": "2019-02-13T09:27:54.900Z", 120 | "updatedAt": "2019-02-13T09:27:54.900Z", 121 | "__v": 0 122 | }, 123 | 124 | ``` 125 | 126 | AFTER IMPLEMENTING THE SOLUTION (detailed below in the routes code) - GET request would send me the below. Now see I have the top-level field "imported_commodity_name" updated dynamically in my backend routes code. 127 | 128 | ```js 129 | { 130 | "_id": "5c63e31a52cfb71e2f868f86", 131 | "imported_commodity": { 132 | "_id": "5c6121e4722f134f27c49ee4", 133 | "name": "silicon-12", 134 | "type": "Material", 135 | "createdAt": "2019-02-11T07:19:00.608Z", 136 | "updatedAt": "2019-02-12T14:21:43.478Z", 137 | "__v": 0 138 | }, 139 | "imported_date": "2019-02-13T00:00:00.000Z", 140 | "qty_in_mts": 89, 141 | "no_of_vessels_per_day": 299, 142 | "port": null, 143 | "imported_commodity_name": "silicon-12", 144 | "createdAt": "2019-02-13T09:27:54.900Z", 145 | "updatedAt": "2019-02-13T09:27:54.900Z", 146 | "__v": 0 147 | }, 148 | ``` 149 | 150 | ### SOLUTION - I just had to implement a async-await OR .then() OR exec() techinques in the routes/controllers file to fetch the data from the referenced Model (Commodity) and update the values of the top-level field. So all the below codes for the POST request will work. 151 | 152 | ```js 153 | // Create a new item (note, I have to have an object_id reference of the relevant commodity) -Working in Postman 154 | 155 | // ALTERNATIVE - 1 - POST request to add new item WITH .then() - WORKING 156 | router.post("/", (req, res, next) => { 157 | let imports = new Import(req.body); 158 | Commodity.findById(imports.imported_commodity, (err, result) => { 159 | imports.imported_commodity_name = result.name; 160 | }).then(() => { 161 | imports.save((err, newImport) => { 162 | if (err) { 163 | console.log("Failed to post new data because ", err); 164 | // return next(err); 165 | } else { 166 | res.status(200).send(newImport); 167 | } 168 | }); 169 | }); 170 | }); 171 | 172 | ### ALTERNATIVE - 2 - POST request to add new item WITH async-await - WORKING 173 | router.post("/", async (req, res, next) => { 174 | let imports = new Import(req.body); 175 | 176 | await Commodity.findById(imports.imported_commodity, (err, result) => { 177 | imports.imported_commodity_name = result.name; 178 | }); 179 | imports.save((err, newImport) => { 180 | if (err) { 181 | console.log("Failed to post new data because ", err); 182 | // return next(err); 183 | } else { 184 | res.status(200).send(newImport); 185 | } 186 | }); 187 | }); 188 | 189 | #### ALTERNATIVE - 3 - POST request to add new item WITH async-await - WORKING 190 | 191 | ```js 192 | router.post("/", async (req, res, next) => { 193 | let imports = await new Import(req.body); 194 | 195 | await Commodity.findById(imports.imported_commodity, (err, result) => { 196 | imports.imported_commodity_name = result.name; 197 | }).exec(() => { 198 | imports.save((err, newImport) => { 199 | if (err) { 200 | console.log("Failed to post new data because ", err); 201 | // return next(err); 202 | } else { 203 | res.status(200).send(newImport); 204 | } 205 | }); 206 | }); 207 | }); 208 | ``` 209 | 210 | #### WITHOUT ANY .then(), Promise or async-await, where the nested object's value will not be grabbed at all in the top level returned object from the POST request - WORKING 211 | 212 | ```js 213 | router.post("/", (req, res, next) => { 214 | let imports = new Import(req.body); 215 | // imports.port = req.decoded.port._id || ""; 216 | 217 | imports.save((err, newImport) => { 218 | if (err) { 219 | console.log("Failed to post new data because ", err); 220 | // return next(err); 221 | } else { 222 | res.status(200).json(newImport); 223 | } 224 | }); 225 | }); 226 | ``` 227 | 228 | #### However, my final implemented solution to the above problem was completely different. That is, I did not add the new top level field to the db-schema from the nested object. Rather, in the backend routing code, after I fetched the data from mongo, I use Array.map to create a new array and adding a new top-level field ('imported_commodity_objectId') to the data. And as a response to the front-end returned that restructured data. I did that with the below utility function in my backend 229 | 230 | ```js 231 | const addCommodityNameFieldToItems = arr => { 232 | let newArr = []; 233 | arr.map(item => { 234 | if ( 235 | typeof item.imported_commodity_objectId === "object" && 236 | item.imported_commodity_objectId !== null 237 | ) { 238 | item.imported_commodity_name = item.imported_commodity_objectId.name; 239 | newArr.push(item); 240 | } 241 | }); 242 | return newArr; 243 | }; 244 | ``` 245 | 246 | And then the GET request route will do as below 247 | 248 | ```js 249 | // Working with imported_commodity_name 250 | router.get("/", (req, res, next) => { 251 | Import.find( 252 | {}, 253 | null, 254 | { 255 | sort: { createdAt: -1 } 256 | }, 257 | (err, docs) => { 258 | if (err) { 259 | return next(err); 260 | } else { 261 | let totalItemsWithCommodityNameField = addCommodityNameFieldToItems( 262 | docs 263 | ); 264 | res.status(200).json(totalItemsWithCommodityNameField); 265 | } 266 | } 267 | ); 268 | }); 269 | ``` 270 | 271 | ### VERY IMPORTANT NOTE - NONE OF THE ABOVE WAYS TO CREATE THAT EXTRA FIELD-NAME ('imported_commodity_name') SHOULD BE USED - AS THE VALUE OF THIS WILL NOT GET PROPERYLY UPDATED WITH WHEN THE RELEVANT COMMODIY NAME IS CHANGED FROM THE COMMODITY MODULE (i.e. in the Commodiy schema the Commodiy's name is changed) 272 | 273 | ### So HER WAS THE FINAL IMPLEMENTED SOLUTION THAT I USED WITH LODASH TO CHANGE THE RECEIVED DATA FORM MONGO (REFORMATTING IT BY ADDING A NEW FIELD) BEFORE SENDING THAT DATA TO THE CLIENT. 274 | 275 | ```JS 276 | const _ = require("lodash"); 277 | const flatMap = require("lodash/flatMap"); 278 | 279 | const createAllocation = item => ({ 280 | _id: item._id, 281 | exported_commodity_objectId: item.exported_commodity_objectId._id, 282 | qty_in_mts: item.qty_in_mts, 283 | exported_date: item.exported_date, 284 | no_of_vessels_per_day: item.no_of_vessels_per_day, 285 | exported_commodity_name: item.exported_commodity_objectId.name 286 | }); 287 | 288 | // To GET ALL Exports without mongoose-paginate - Working in Postman* 289 | router.get("/", (req, res, next) => { 290 | Export.find( 291 | {}, 292 | null, 293 | { 294 | sort: { createdAt: -1 } 295 | }, 296 | (err, docs) => { 297 | if (err) { 298 | return next(err); 299 | } else { 300 | const flatDocs = _.flatMap(docs, item => [createAllocation(item)]); 301 | res.status(200).json(flatDocs); 302 | } 303 | } 304 | ); 305 | }); 306 | 307 | ``` 308 | 309 | See details in - /home/paul/codes-Lap/React/Volteo/IES/IES-Rohan-WIP/server/routes/exportRoutes.js 310 | 311 | #### Other Reading sources 312 | 313 | // https://mongoosejs.com/docs/promises.html 314 | --------------------------------------------------------------------------------