├── helpers └── readme.txt ├── models ├── readme.txt └── db.js ├── middlewares └── readme.txt ├── tests └── users.spec.js ├── README.md ├── controllers ├── index.js └── users.js ├── index.html ├── gulpfile.js ├── app.js ├── package.json ├── LICENSE └── logs └── access.log /helpers/readme.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /models/readme.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /middlewares/readme.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/users.spec.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-express-app-structure 2 | -------------------------------------------------------------------------------- /controllers/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | , router = express.Router(); 3 | 4 | router.use('/users', require('./users')); 5 | 6 | module.exports = router; -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /controllers/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | , router = express.Router(); 3 | 4 | 5 | router.get('/', function(req, res) { 6 | res.json({'users':'ALL'}); 7 | }); 8 | 9 | router.get('/:id', function(req, res) { 10 | res.json({'user_id':req.params.id}); 11 | }); 12 | 13 | module.exports = router; -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require( 'gulp' ), 2 | server = require( 'gulp-develop-server' ) 3 | jshint = require('gulp-jshint'); 4 | 5 | gulp.task('lint', function() { 6 | return gulp.src('app.js') 7 | .pipe(jshint()) 8 | .pipe(jshint.reporter('default')); 9 | }); 10 | 11 | // run server 12 | gulp.task( 'server:start', function() { 13 | server.listen( { path: './app.js' } ); 14 | }); 15 | 16 | // restart server if app.js changed 17 | gulp.task( 'server:restart', function() { 18 | gulp.watch( [ './app.js' ], server.restart ); 19 | }); 20 | 21 | gulp.task('default', ['lint','server:start','server:restart']); -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var bodyParser = require('body-parser'); 4 | var fs = require('fs'); 5 | var morgan = require('morgan'); 6 | var db = require('./models/db.js'); 7 | 8 | if(GLOBAL.SQLpool === undefined){ 9 | GLOBAL.SQLpool = db.createPool(); //create a global sql pool connection 10 | } 11 | 12 | morgan.token('res', function getId(res) { 13 | return res; 14 | }); 15 | 16 | var accessLogStream = fs.createWriteStream(__dirname + '/logs/access.log', {flags: 'a'}); 17 | // setup the logger 18 | app.use(morgan(':req[body] :res[body]', {stream: accessLogStream})); 19 | 20 | app.use(bodyParser.json()); 21 | 22 | app.use(require('./controllers')); 23 | 24 | app.get('/',function(req,res){ 25 | res.sendFile(__dirname + "/index.html"); 26 | }); 27 | 28 | app.listen('3000', function(){ 29 | 30 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "expapp", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "gulp": "^3.9.0", 13 | "gulp-develop-server": "^0.5.0", 14 | "gulp-jshint": "^1.12.0", 15 | "jsdoc": "^3.4.0", 16 | "mocha": "^2.3.4", 17 | "should": "^7.1.1", 18 | "supertest": "^1.1.0" 19 | }, 20 | "dependencies": { 21 | "async": "^1.5.0", 22 | "body-parser": "^1.14.1", 23 | "connect-redis": "^3.0.1", 24 | "express": "^4.13.3", 25 | "express-session": "^1.12.1", 26 | "fs": "0.0.2", 27 | "http-proxy": "^1.12.0", 28 | "morgan": "^1.6.1", 29 | "multer": "^1.1.0", 30 | "mysql": "^2.9.0", 31 | "node-mysql": "^0.4.2", 32 | "xls-to-json": "^0.3.2", 33 | "xlsx-to-json": "^0.2.4" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 rahil471 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /models/db.js: -------------------------------------------------------------------------------- 1 | var mysql = require("mysql"); 2 | 3 | /** 4 | * Defines database operations. 5 | * @class 6 | */ 7 | var DB = function(){}; 8 | 9 | DB.prototype.createPool = function(){ 10 | return mysql.createPool({ 11 | host : 'localhost', 12 | user : 'root', 13 | password : '', 14 | connectionLimit : 100 15 | }); 16 | } 17 | 18 | /** 19 | * Establishes mysql connection and returns the connection object. 20 | * @function 21 | * @param {object} pool - Mysql pool object. 22 | * @param {function} callback - Callback. 23 | */ 24 | DB.prototype.getConnection = function(pool,callback){ 25 | var self = this; 26 | pool.getConnection(function(err, connection) { 27 | if(err) { 28 | //logging here 29 | console.log(err); 30 | callback(true); 31 | return; 32 | } 33 | connection.on('error', function(err) { 34 | if(err.code === "PROTOCOL_CONNECTION_LOST") { 35 | connection.destroy(); 36 | } else { 37 | connection.release(); 38 | } 39 | console.log(err); 40 | callback(true); 41 | return; 42 | }); 43 | callback(null,connection); 44 | }); 45 | } 46 | 47 | /** 48 | * Establishes mysql connection, begins transaction and returns the transactio connection object. 49 | * @function 50 | * @param {object} pool - Mysql pool object. 51 | * @param {function} callback - Callback. 52 | */ 53 | DB.prototype.createTransaction = function(pool,callback) { 54 | var self = this; 55 | self.getConnection(pool,function(err,connection){ 56 | if(err) { 57 | //logging here 58 | console.log(err); 59 | callback(true); 60 | return; 61 | } 62 | connection.beginTransaction(function(err) { 63 | if(err){ 64 | console.log(err); 65 | callback(true); 66 | return; 67 | } 68 | callback(null,connection) 69 | }); 70 | }); 71 | } 72 | 73 | module.exports = new DB(); -------------------------------------------------------------------------------- /logs/access.log: -------------------------------------------------------------------------------- 1 | ::1 - - [18/Nov/2015:12:10:21 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 2 | ::1 - - [18/Nov/2015:12:12:06 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 3 | ::1 - - [18/Nov/2015:12:12:07 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 4 | ::1 - - [18/Nov/2015:12:12:07 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 5 | ::1 - - [18/Nov/2015:12:12:07 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 6 | ::1 - - [18/Nov/2015:12:12:08 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 7 | ::1 - - [18/Nov/2015:12:12:08 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 8 | ::1 - - [18/Nov/2015:12:12:08 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 9 | ::1 - - [18/Nov/2015:12:13:36 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 10 | ::1 - - [18/Nov/2015:12:13:40 +0000] "POST /users/picture HTTP/1.1" 200 18 "http://localhost:3000/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 11 | ::1 - - [18/Nov/2015:12:16:25 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 12 | ::1 - - [18/Nov/2015:12:16:49 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 13 | ::1 - - [18/Nov/2015:12:16:50 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 14 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 15 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 16 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 17 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 18 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 19 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 20 | ::1 - - [18/Nov/2015:12:16:51 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 21 | ::1 - - [18/Nov/2015:12:16:52 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 22 | ::1 - - [18/Nov/2015:12:16:52 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 23 | ::1 - - [18/Nov/2015:12:16:52 +0000] "POST /users HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" 24 | immediate 25 | immediate 26 | immediate 27 | [object Object] 28 | [object Object] 29 | {"lel":"lel"} 30 | - - 31 | - - 32 | - - 33 | - [object Object] 34 | - [object Object] 35 | - [object Object] 36 | - [object Object] 37 | - [object Object] 38 | - [object Object] 39 | - [object Object] 40 | - [object Object] 41 | - [object Object] 42 | - [object Object] 43 | - [object Object] 44 | - [object Object] 45 | - [object Object] 46 | - [object Object] 47 | - [object Object] 48 | - [object Object] 49 | - [object Object] 50 | - [object Object] 51 | - [object Object] 52 | - [object Object] 53 | - [object Object] 54 | - [object Object] 55 | - [object Object] 56 | - [object Object] 57 | - [object Object] 58 | - [object Object] 59 | - [object Object] 60 | - [object Object] 61 | - [object Object] 62 | - [object Object] 63 | - [object Object] 64 | - [object Object] 65 | - [object Object] 66 | - [object Object] 67 | - [object Object] 68 | - [object Object] 69 | - [object Object] 70 | - [object Object] 71 | - [object Object] 72 | - [object Object] 73 | - [object Object] 74 | - [object Object] 75 | - [object Object] 76 | - [object Object] 77 | --------------------------------------------------------------------------------