├── .dockerignore ├── .gitignore ├── Dockerfile ├── README.md ├── app.js ├── controllers └── sharks.js ├── db.js ├── models └── sharks.js ├── package-lock.json ├── package.json ├── routes ├── index.js └── sharks.js └── views ├── css └── styles.css ├── getshark.html ├── index.html └── sharks.html /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | Dockerfile 4 | .dockerignore 5 | .git 6 | README.md 7 | .gitignore 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # parcel-bundler cache (https://parceljs.org/) 61 | .cache 62 | 63 | # next.js build output 64 | .next 65 | 66 | # nuxt.js build output 67 | .nuxt 68 | 69 | # vuepress build output 70 | .vuepress/dist 71 | 72 | # Serverless directories 73 | .serverless/ 74 | 75 | # FuseBox cache 76 | .fusebox/ 77 | 78 | #DynamoDB Local files 79 | .dynamodb/ 80 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10-alpine 2 | 3 | RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app 4 | 5 | WORKDIR /home/node/app 6 | 7 | COPY package*.json ./ 8 | 9 | USER node 10 | 11 | RUN npm install 12 | 13 | COPY --chown=node:node . . 14 | 15 | EXPOSE 8080 16 | 17 | CMD [ "node", "app.js" ] 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Project code for tutorial on integrating MongoDB into Node.js application using Mongoose: https://www.digitalocean.com/community/tutorials/how-to-integrate-mongodb-with-your-node-application 2 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const router = express.Router(); 4 | const db = require('./db'); 5 | const sharks = require('./routes/sharks'); 6 | 7 | const path = __dirname + '/views/'; 8 | const port = 8080; 9 | 10 | app.engine('html', require('ejs').renderFile); 11 | app.set('view engine', 'html'); 12 | app.use(express.urlencoded({ extended: true })); 13 | app.use(express.static(path)); 14 | app.use('/sharks', sharks); 15 | 16 | app.listen(port, function () { 17 | console.log('Example app listening on port 8080!') 18 | }) 19 | -------------------------------------------------------------------------------- /controllers/sharks.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const Shark = require('../models/sharks'); 3 | 4 | exports.index = function (req, res) { 5 | res.sendFile(path.resolve('views/sharks.html')); 6 | }; 7 | 8 | exports.create = function (req, res) { 9 | var newShark = new Shark(req.body); 10 | console.log(req.body); 11 | newShark.save(function (err) { 12 | if(err) { 13 | res.status(400).send('Unable to save shark to database'); 14 | } else { 15 | res.redirect('/sharks/getshark'); 16 | } 17 | }); 18 | }; 19 | 20 | exports.list = function (req, res) { 21 | Shark.find({}).exec(function (err, sharks) { 22 | if (err) { 23 | return res.send(500, err); 24 | } 25 | res.render('getshark', { 26 | sharks: sharks 27 | }); 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | 3 | const MONGO_USERNAME = 'sammy'; 4 | const MONGO_PASSWORD = 'password'; 5 | const MONGO_HOSTNAME = '127.0.0.1'; 6 | const MONGO_PORT = '27017'; 7 | const MONGO_DB = 'sharkinfo'; 8 | 9 | const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`; 10 | 11 | mongoose.connect(url, {useNewUrlParser: true}); 12 | -------------------------------------------------------------------------------- /models/sharks.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const Schema = mongoose.Schema; 3 | 4 | const Shark = new Schema ({ 5 | name: { type: String, required: true }, 6 | character: { type: String, required: true }, 7 | }); 8 | 9 | module.exports = mongoose.model('Shark', Shark) 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-image-demo", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "async": { 22 | "version": "2.6.1", 23 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 24 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 25 | "requires": { 26 | "lodash": "^4.17.10" 27 | } 28 | }, 29 | "bluebird": { 30 | "version": "3.5.1", 31 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 32 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 33 | }, 34 | "body-parser": { 35 | "version": "1.18.3", 36 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 37 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 38 | "requires": { 39 | "bytes": "3.0.0", 40 | "content-type": "~1.0.4", 41 | "debug": "2.6.9", 42 | "depd": "~1.1.2", 43 | "http-errors": "~1.6.3", 44 | "iconv-lite": "0.4.23", 45 | "on-finished": "~2.3.0", 46 | "qs": "6.5.2", 47 | "raw-body": "2.3.3", 48 | "type-is": "~1.6.16" 49 | } 50 | }, 51 | "bson": { 52 | "version": "1.1.0", 53 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.0.tgz", 54 | "integrity": "sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==" 55 | }, 56 | "bytes": { 57 | "version": "3.0.0", 58 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 59 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 60 | }, 61 | "content-disposition": { 62 | "version": "0.5.2", 63 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 64 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 65 | }, 66 | "content-type": { 67 | "version": "1.0.4", 68 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 69 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 70 | }, 71 | "cookie": { 72 | "version": "0.3.1", 73 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 74 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 75 | }, 76 | "cookie-signature": { 77 | "version": "1.0.6", 78 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 79 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 80 | }, 81 | "debug": { 82 | "version": "2.6.9", 83 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 84 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 85 | "requires": { 86 | "ms": "2.0.0" 87 | } 88 | }, 89 | "depd": { 90 | "version": "1.1.2", 91 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 92 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 93 | }, 94 | "destroy": { 95 | "version": "1.0.4", 96 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 97 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 98 | }, 99 | "ee-first": { 100 | "version": "1.1.1", 101 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 102 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 103 | }, 104 | "ejs": { 105 | "version": "2.6.1", 106 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", 107 | "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" 108 | }, 109 | "encodeurl": { 110 | "version": "1.0.2", 111 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 112 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 113 | }, 114 | "escape-html": { 115 | "version": "1.0.3", 116 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 117 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 118 | }, 119 | "etag": { 120 | "version": "1.8.1", 121 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 122 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 123 | }, 124 | "express": { 125 | "version": "4.16.4", 126 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 127 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 128 | "requires": { 129 | "accepts": "~1.3.5", 130 | "array-flatten": "1.1.1", 131 | "body-parser": "1.18.3", 132 | "content-disposition": "0.5.2", 133 | "content-type": "~1.0.4", 134 | "cookie": "0.3.1", 135 | "cookie-signature": "1.0.6", 136 | "debug": "2.6.9", 137 | "depd": "~1.1.2", 138 | "encodeurl": "~1.0.2", 139 | "escape-html": "~1.0.3", 140 | "etag": "~1.8.1", 141 | "finalhandler": "1.1.1", 142 | "fresh": "0.5.2", 143 | "merge-descriptors": "1.0.1", 144 | "methods": "~1.1.2", 145 | "on-finished": "~2.3.0", 146 | "parseurl": "~1.3.2", 147 | "path-to-regexp": "0.1.7", 148 | "proxy-addr": "~2.0.4", 149 | "qs": "6.5.2", 150 | "range-parser": "~1.2.0", 151 | "safe-buffer": "5.1.2", 152 | "send": "0.16.2", 153 | "serve-static": "1.13.2", 154 | "setprototypeof": "1.1.0", 155 | "statuses": "~1.4.0", 156 | "type-is": "~1.6.16", 157 | "utils-merge": "1.0.1", 158 | "vary": "~1.1.2" 159 | } 160 | }, 161 | "finalhandler": { 162 | "version": "1.1.1", 163 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 164 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 165 | "requires": { 166 | "debug": "2.6.9", 167 | "encodeurl": "~1.0.2", 168 | "escape-html": "~1.0.3", 169 | "on-finished": "~2.3.0", 170 | "parseurl": "~1.3.2", 171 | "statuses": "~1.4.0", 172 | "unpipe": "~1.0.0" 173 | } 174 | }, 175 | "forwarded": { 176 | "version": "0.1.2", 177 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 178 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 179 | }, 180 | "fresh": { 181 | "version": "0.5.2", 182 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 183 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 184 | }, 185 | "http-errors": { 186 | "version": "1.6.3", 187 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 188 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 189 | "requires": { 190 | "depd": "~1.1.2", 191 | "inherits": "2.0.3", 192 | "setprototypeof": "1.1.0", 193 | "statuses": ">= 1.4.0 < 2" 194 | } 195 | }, 196 | "iconv-lite": { 197 | "version": "0.4.23", 198 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 199 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 200 | "requires": { 201 | "safer-buffer": ">= 2.1.2 < 3" 202 | } 203 | }, 204 | "inherits": { 205 | "version": "2.0.3", 206 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 207 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 208 | }, 209 | "ipaddr.js": { 210 | "version": "1.8.0", 211 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 212 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 213 | }, 214 | "kareem": { 215 | "version": "2.3.0", 216 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", 217 | "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" 218 | }, 219 | "lodash": { 220 | "version": "4.17.11", 221 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 222 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 223 | }, 224 | "media-typer": { 225 | "version": "0.3.0", 226 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 227 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 228 | }, 229 | "memory-pager": { 230 | "version": "1.5.0", 231 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 232 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 233 | "optional": true 234 | }, 235 | "merge-descriptors": { 236 | "version": "1.0.1", 237 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 238 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 239 | }, 240 | "methods": { 241 | "version": "1.1.2", 242 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 243 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 244 | }, 245 | "mime": { 246 | "version": "1.4.1", 247 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 248 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 249 | }, 250 | "mime-db": { 251 | "version": "1.37.0", 252 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 253 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 254 | }, 255 | "mime-types": { 256 | "version": "2.1.21", 257 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 258 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 259 | "requires": { 260 | "mime-db": "~1.37.0" 261 | } 262 | }, 263 | "mongodb": { 264 | "version": "3.1.13", 265 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.13.tgz", 266 | "integrity": "sha512-sz2dhvBZQWf3LRNDhbd30KHVzdjZx9IKC0L+kSZ/gzYquCF5zPOgGqRz6sSCqYZtKP2ekB4nfLxhGtzGHnIKxA==", 267 | "requires": { 268 | "mongodb-core": "3.1.11", 269 | "safe-buffer": "^5.1.2" 270 | } 271 | }, 272 | "mongodb-core": { 273 | "version": "3.1.11", 274 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.11.tgz", 275 | "integrity": "sha512-rD2US2s5qk/ckbiiGFHeu+yKYDXdJ1G87F6CG3YdaZpzdOm5zpoAZd/EKbPmFO6cQZ+XVXBXBJ660sSI0gc6qg==", 276 | "requires": { 277 | "bson": "^1.1.0", 278 | "require_optional": "^1.0.1", 279 | "safe-buffer": "^5.1.2", 280 | "saslprep": "^1.0.0" 281 | } 282 | }, 283 | "mongoose": { 284 | "version": "5.4.10", 285 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.4.10.tgz", 286 | "integrity": "sha512-yJl+A7p8QF++tyBl6fRGFON5GV57MTXLKNiaiqgX5vZs1qJpcZpPiUGU5odBiqTHFYPybuRp8dW9Qtv4K6SxBQ==", 287 | "requires": { 288 | "async": "2.6.1", 289 | "bson": "~1.1.0", 290 | "kareem": "2.3.0", 291 | "mongodb": "3.1.13", 292 | "mongodb-core": "3.1.11", 293 | "mongoose-legacy-pluralize": "1.0.2", 294 | "mpath": "0.5.1", 295 | "mquery": "3.2.0", 296 | "ms": "2.0.0", 297 | "regexp-clone": "0.0.1", 298 | "safe-buffer": "5.1.2", 299 | "sliced": "1.0.1" 300 | } 301 | }, 302 | "mongoose-legacy-pluralize": { 303 | "version": "1.0.2", 304 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 305 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 306 | }, 307 | "mpath": { 308 | "version": "0.5.1", 309 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz", 310 | "integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==" 311 | }, 312 | "mquery": { 313 | "version": "3.2.0", 314 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz", 315 | "integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==", 316 | "requires": { 317 | "bluebird": "3.5.1", 318 | "debug": "3.1.0", 319 | "regexp-clone": "0.0.1", 320 | "safe-buffer": "5.1.2", 321 | "sliced": "1.0.1" 322 | }, 323 | "dependencies": { 324 | "debug": { 325 | "version": "3.1.0", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 327 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 328 | "requires": { 329 | "ms": "2.0.0" 330 | } 331 | } 332 | } 333 | }, 334 | "ms": { 335 | "version": "2.0.0", 336 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 337 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 338 | }, 339 | "negotiator": { 340 | "version": "0.6.1", 341 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 342 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 343 | }, 344 | "on-finished": { 345 | "version": "2.3.0", 346 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 347 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 348 | "requires": { 349 | "ee-first": "1.1.1" 350 | } 351 | }, 352 | "parseurl": { 353 | "version": "1.3.2", 354 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 355 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 356 | }, 357 | "path-to-regexp": { 358 | "version": "0.1.7", 359 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 360 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 361 | }, 362 | "proxy-addr": { 363 | "version": "2.0.4", 364 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 365 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 366 | "requires": { 367 | "forwarded": "~0.1.2", 368 | "ipaddr.js": "1.8.0" 369 | } 370 | }, 371 | "qs": { 372 | "version": "6.5.2", 373 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 374 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 375 | }, 376 | "range-parser": { 377 | "version": "1.2.0", 378 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 379 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 380 | }, 381 | "raw-body": { 382 | "version": "2.3.3", 383 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 384 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 385 | "requires": { 386 | "bytes": "3.0.0", 387 | "http-errors": "1.6.3", 388 | "iconv-lite": "0.4.23", 389 | "unpipe": "1.0.0" 390 | } 391 | }, 392 | "regexp-clone": { 393 | "version": "0.0.1", 394 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 395 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 396 | }, 397 | "require_optional": { 398 | "version": "1.0.1", 399 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 400 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 401 | "requires": { 402 | "resolve-from": "^2.0.0", 403 | "semver": "^5.1.0" 404 | } 405 | }, 406 | "resolve-from": { 407 | "version": "2.0.0", 408 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 409 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 410 | }, 411 | "safe-buffer": { 412 | "version": "5.1.2", 413 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 414 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 415 | }, 416 | "safer-buffer": { 417 | "version": "2.1.2", 418 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 419 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 420 | }, 421 | "saslprep": { 422 | "version": "1.0.2", 423 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", 424 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", 425 | "optional": true, 426 | "requires": { 427 | "sparse-bitfield": "^3.0.3" 428 | } 429 | }, 430 | "semver": { 431 | "version": "5.6.0", 432 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 433 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 434 | }, 435 | "send": { 436 | "version": "0.16.2", 437 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 438 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 439 | "requires": { 440 | "debug": "2.6.9", 441 | "depd": "~1.1.2", 442 | "destroy": "~1.0.4", 443 | "encodeurl": "~1.0.2", 444 | "escape-html": "~1.0.3", 445 | "etag": "~1.8.1", 446 | "fresh": "0.5.2", 447 | "http-errors": "~1.6.2", 448 | "mime": "1.4.1", 449 | "ms": "2.0.0", 450 | "on-finished": "~2.3.0", 451 | "range-parser": "~1.2.0", 452 | "statuses": "~1.4.0" 453 | } 454 | }, 455 | "serve-static": { 456 | "version": "1.13.2", 457 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 458 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 459 | "requires": { 460 | "encodeurl": "~1.0.2", 461 | "escape-html": "~1.0.3", 462 | "parseurl": "~1.3.2", 463 | "send": "0.16.2" 464 | } 465 | }, 466 | "setprototypeof": { 467 | "version": "1.1.0", 468 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 469 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 470 | }, 471 | "sliced": { 472 | "version": "1.0.1", 473 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 474 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 475 | }, 476 | "sparse-bitfield": { 477 | "version": "3.0.3", 478 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 479 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 480 | "optional": true, 481 | "requires": { 482 | "memory-pager": "^1.0.2" 483 | } 484 | }, 485 | "statuses": { 486 | "version": "1.4.0", 487 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 488 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 489 | }, 490 | "type-is": { 491 | "version": "1.6.16", 492 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 493 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 494 | "requires": { 495 | "media-typer": "0.3.0", 496 | "mime-types": "~2.1.18" 497 | } 498 | }, 499 | "unpipe": { 500 | "version": "1.0.0", 501 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 502 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 503 | }, 504 | "utils-merge": { 505 | "version": "1.0.1", 506 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 507 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 508 | }, 509 | "vary": { 510 | "version": "1.1.2", 511 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 512 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 513 | } 514 | } 515 | } 516 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-image-demo", 3 | "version": "1.0.0", 4 | "description": "nodejs image demo", 5 | "author": "katjuell ", 6 | "license": "MIT", 7 | "main": "app.js", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/katjuell/nodejs-image-demo.git" 11 | }, 12 | "keywords": [ 13 | "nodejs", 14 | "bootstrap", 15 | "express" 16 | ], 17 | "dependencies": { 18 | "ejs": "^2.6.1", 19 | "express": "^4.16.4", 20 | "mongoose": "^5.4.10" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const path = require('path'); 4 | 5 | router.use (function (req,res,next) { 6 | console.log('/' + req.method); 7 | next(); 8 | }); 9 | 10 | router.get('/',function(req,res){ 11 | res.sendFile(path.resolve('views/index.html')); 12 | }); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /routes/sharks.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const shark = require('../controllers/sharks'); 4 | 5 | router.get('/', function(req, res){ 6 | shark.index(req,res); 7 | }); 8 | 9 | router.post('/addshark', function(req, res) { 10 | shark.create(req,res); 11 | }); 12 | 13 | router.get('/getshark', function(req, res) { 14 | shark.list(req,res); 15 | }); 16 | 17 | module.exports = router; 18 | -------------------------------------------------------------------------------- /views/css/styles.css: -------------------------------------------------------------------------------- 1 | .navbar { 2 | margin-bottom: 0; 3 | background: #000000; 4 | } 5 | 6 | body { 7 | background: #000000; 8 | color: #ffffff; 9 | font-family: 'Merriweather', sans-serif; 10 | } 11 | 12 | h1, 13 | h2 { 14 | font-weight: bold; 15 | } 16 | 17 | p { 18 | font-size: 16px; 19 | color: #ffffff; 20 | } 21 | 22 | .jumbotron { 23 | background: #0048CD; 24 | color: white; 25 | text-align: center; 26 | } 27 | 28 | .jumbotron p { 29 | color: white; 30 | font-size: 26px; 31 | } 32 | 33 | .btn-primary { 34 | color: #fff; 35 | text-color: #000000; 36 | border-color: white; 37 | margin-bottom: 5px; 38 | } 39 | 40 | img, 41 | video, 42 | audio { 43 | margin-top: 20px; 44 | max-width: 80%; 45 | } 46 | 47 | div.caption: { 48 | float: left; 49 | clear: both; 50 | } 51 | -------------------------------------------------------------------------------- /views/getshark.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About Sharks 6 | 7 | 8 | 9 | 10 | 11 | 12 | 26 |
27 |

Shark Info

28 |
29 |
30 |
31 |
32 |

33 |

Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans. 34 |
35 | Sawshark 36 |

37 |
38 |
39 |

40 |

Other sharks are known to be friendly and welcoming!
41 | Sammy the Shark 42 |

43 |
44 |
45 |

46 |

Your Sharks
47 |
    48 | <% sharks.forEach(function(shark) { %> 49 |

    Name: <%= shark.name %>

    50 |

    Character: <%= shark.character %>

    51 | <% }); %> 52 |
53 |

54 |
55 |
56 |
57 | 58 | -------------------------------------------------------------------------------- /views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About Sharks 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 28 |
29 |
30 |

Want to Learn About Sharks?

31 |

Are you ready to learn about sharks?

32 |
33 |

Get Shark Info 34 |

35 |
36 |
37 |
38 |
39 |
40 |

Not all sharks are alike

41 |

Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans. 42 |

43 |
44 |
45 |

Sharks are ancient

46 |

There is evidence to suggest that sharks lived up to 400 million years ago. 47 |

48 |
49 |
50 |
51 | 52 | 53 | -------------------------------------------------------------------------------- /views/sharks.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About Sharks 6 | 7 | 8 | 9 | 10 | 11 | 12 | 26 |
27 |

Shark Info

28 |
29 |
30 |
31 |
32 |

33 |

Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans. 34 |
35 | Sawshark 36 |

37 |
38 |
39 |

40 |

Other sharks are known to be friendly and welcoming!
41 | Sammy the Shark 42 |

43 |
44 |
45 |

46 |

47 |
Enter Your Shark
48 | 49 | 50 | 51 |
52 |

53 |
54 |
55 |
56 | 57 | --------------------------------------------------------------------------------