├── public ├── images │ └── test.jpg └── stylesheets │ └── style.css ├── views ├── index.jade ├── error.jade └── layout.jade ├── README.md ├── routes ├── users.js └── index.js ├── .gitattributes ├── package.json ├── .gitignore ├── app.js ├── bin └── www └── test2.sql /public/images/test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techgeekkd/Node_Express_MySql/HEAD/public/images/test.jpg -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | 7 | -------------------------------------------------------------------------------- /views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node_Express_MySql 2 | 3 | Ep. 03 - Node JS + Express + MySQL -- Creating RESTful WebService in 15 MINUTES : https://www.youtube.com/watch?v=Gz4cOWn8_c4 4 | Blog : https://techgeekkd.blogspot.in/2016/05/ep-03-node-js-express-mysql-creating.html 5 | -------------------------------------------------------------------------------- /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; 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kdApp", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.13.2", 10 | "cookie-parser": "~1.3.5", 11 | "debug": "~2.2.0", 12 | "express": "~4.13.1", 13 | "jade": "~1.11.0", 14 | "morgan": "~1.6.1", 15 | "serve-favicon": "~2.3.0", 16 | "mysql":"", 17 | "express-myconnection":"" 18 | } 19 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var favicon = require('serve-favicon'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | var routes = require('./routes/index'); 8 | var users = require('./routes/users'); 9 | var mysql = require('mysql'); 10 | var connection = require("express-myconnection"); 11 | 12 | var app = express(); 13 | 14 | // Create Sql Connection 15 | app.use(connection(mysql, { 16 | host: "localhost", 17 | user: "root", 18 | password: "root", 19 | database: "test" 20 | },'request')); 21 | 22 | // view engine setup 23 | app.set('views', path.join(__dirname, 'views')); 24 | app.set('view engine', 'jade'); 25 | 26 | // uncomment after placing your favicon in /public 27 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 28 | app.use(logger('dev')); 29 | app.use(bodyParser.json()); 30 | app.use(bodyParser.urlencoded({ extended: false })); 31 | app.use(cookieParser()); 32 | app.use(express.static(path.join(__dirname, 'public'))); 33 | 34 | app.use('/', routes); 35 | app.use('/users', users); 36 | 37 | // catch 404 and forward to error handler 38 | app.use(function(req, res, next) { 39 | var err = new Error('Not Found'); 40 | err.status = 404; 41 | next(err); 42 | }); 43 | 44 | // error handlers 45 | 46 | // development error handler 47 | // will print stacktrace 48 | if (app.get('env') === 'development') { 49 | app.use(function(err, req, res, next) { 50 | res.status(err.status || 500); 51 | res.render('error', { 52 | message: err.message, 53 | error: err 54 | }); 55 | }); 56 | } 57 | 58 | // production error handler 59 | // no stacktraces leaked to user 60 | app.use(function(err, req, res, next) { 61 | res.status(err.status || 500); 62 | res.render('error', { 63 | message: err.message, 64 | error: {} 65 | }); 66 | }); 67 | 68 | 69 | module.exports = app; 70 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('kdApp: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 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var url = require('url'); 4 | 5 | /* GET home page. */ 6 | router.get('/', function(req, res, next) { 7 | res.render('index', { title: 'Express Tech Geek KD' }); 8 | }); 9 | 10 | module.exports = router; 11 | 12 | /* Create Employee Service. */ 13 | router.post('/techgeek/v1/createEmployee', function(req,res,next){ 14 | try{ 15 | var reqObj = req.body; 16 | console.log(reqObj); 17 | req.getConnection(function(err, conn){ 18 | if(err) 19 | { 20 | console.error('SQL Connection error: ', err); 21 | return next(err); 22 | } 23 | else 24 | { 25 | var insertSql = "INSERT INTO employee SET ?"; 26 | var insertValues = { 27 | "Emp_Name" : reqObj.empName, 28 | "Role_Id" : reqObj.roleId, 29 | "Dept_Id" : reqObj.deptId 30 | }; 31 | var query = conn.query(insertSql, insertValues, function (err, result){ 32 | if(err){ 33 | console.error('SQL error: ', err); 34 | return next(err); 35 | } 36 | console.log(result); 37 | var Employee_Id = result.insertId; 38 | res.json({"Emp_id":Employee_Id}); 39 | }); 40 | } 41 | }); 42 | } 43 | catch(ex){ 44 | console.error("Internal error:"+ex); 45 | return next(ex); 46 | } 47 | }); 48 | 49 | /* Get Employee Service. */ 50 | router.get('/techgeek/v1/getEmployeeDetails', function(req, res, next) { 51 | try { 52 | /*var roleId = req.param('roleId'); 53 | var deptId = req.param('deptId');*/ 54 | var query = url.parse(req.url,true).query; 55 | console.log(query); 56 | var roleId = query.roleId; 57 | var deptId = query.deptId; 58 | console.log(roleId); 59 | console.log(deptId); 60 | req.getConnection(function(err, conn) { 61 | if (err) { 62 | console.error('SQL Connection error: ', err); 63 | return next(err); 64 | } else { 65 | conn.query('select E.Emp_Name, Date_Format(E.Doj,"%d-%m-%Y") AS DOJ, D.Dept_Name, R.Role_Name from employee E, role R, department D where E.Role_Id = R.Role_Id and E.Dept_Id = D.Dept_Id and E.Role_Id = ? and E.Dept_Id = ? order by DOJ', [roleId,deptId], function(err, rows, fields) { 66 | if (err) { 67 | console.error('SQL error: ', err); 68 | return next(err); 69 | } 70 | var resEmp = []; 71 | for (var empIndex in rows) { 72 | var empObj = rows[empIndex]; 73 | resEmp.push(empObj); 74 | } 75 | res.json(resEmp); 76 | }); 77 | } 78 | }); 79 | } catch (ex) { 80 | console.error("Internal error:" + ex); 81 | return next(ex); 82 | } 83 | }); 84 | -------------------------------------------------------------------------------- /test2.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.1.14 3 | -- http://www.phpmyadmin.net 4 | -- 5 | -- Host: 127.0.0.1 6 | -- Generation Time: Nov 29, 2015 at 03:53 PM 7 | -- Server version: 5.6.17 8 | -- PHP Version: 5.5.12 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET time_zone = "+00:00"; 12 | 13 | 14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 17 | /*!40101 SET NAMES utf8 */; 18 | 19 | -- 20 | -- Database: `test` 21 | -- 22 | 23 | -- -------------------------------------------------------- 24 | 25 | -- 26 | -- Table structure for table `department` 27 | -- 28 | 29 | CREATE TABLE IF NOT EXISTS `department` ( 30 | `Dept_Id` int(4) NOT NULL AUTO_INCREMENT, 31 | `Dept_Name` varchar(30) NOT NULL, 32 | PRIMARY KEY (`Dept_Id`) 33 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 34 | 35 | -- 36 | -- Dumping data for table `department` 37 | -- 38 | 39 | INSERT INTO `department` (`Dept_Id`, `Dept_Name`) VALUES 40 | (1, 'SAP'), 41 | (2, 'JAVA'), 42 | (3, '.NET'), 43 | (4, 'Mainframe'), 44 | (5, 'Mobile'); 45 | 46 | -- -------------------------------------------------------- 47 | 48 | -- 49 | -- Table structure for table `employee` 50 | -- 51 | 52 | CREATE TABLE IF NOT EXISTS `employee` ( 53 | `Emp_Id` int(6) NOT NULL AUTO_INCREMENT, 54 | `Emp_Name` varchar(30) NOT NULL, 55 | `Role_Id` int(4) NOT NULL, 56 | `Dept_Id` int(4) NOT NULL, 57 | `DoJ` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 58 | PRIMARY KEY (`Emp_Id`), 59 | KEY `Dept_Id` (`Dept_Id`), 60 | KEY `Role_Id` (`Role_Id`) 61 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 62 | 63 | -- 64 | -- Dumping data for table `employee` 65 | -- 66 | 67 | INSERT INTO `employee` (`Emp_Id`, `Emp_Name`, `Role_Id`, `Dept_Id`, `DoJ`) VALUES 68 | (1, 'Kd', 4, 4, '2015-11-29 12:33:15'), 69 | (2, 'Rachit', 4, 1, '2015-11-29 12:39:12'), 70 | (3, 'Agnivesh', 5, 2, '2015-11-29 12:39:12'), 71 | (4, 'Harshit', 2, 5, '2015-11-29 13:23:57'), 72 | (5, 'On Demand', 1, 4, '2015-11-29 13:26:28'), 73 | (6, 'Testing Role', 1, 4, '2015-11-29 14:31:30'), 74 | (7, 'Another Employee', 1, 4, '2015-11-29 14:31:39'); 75 | 76 | -- -------------------------------------------------------- 77 | 78 | -- 79 | -- Table structure for table `role` 80 | -- 81 | 82 | CREATE TABLE IF NOT EXISTS `role` ( 83 | `Role_Id` int(4) NOT NULL AUTO_INCREMENT, 84 | `Role_Name` varchar(30) NOT NULL, 85 | PRIMARY KEY (`Role_Id`) 86 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 87 | 88 | -- 89 | -- Dumping data for table `role` 90 | -- 91 | 92 | INSERT INTO `role` (`Role_Id`, `Role_Name`) VALUES 93 | (1, 'Associate'), 94 | (2, 'Senior Associate'), 95 | (3, 'Consultant'), 96 | (4, 'Lead Consultant'), 97 | (5, 'Senior Consultant'); 98 | 99 | -- 100 | -- Constraints for dumped tables 101 | -- 102 | 103 | -- 104 | -- Constraints for table `employee` 105 | -- 106 | ALTER TABLE `employee` 107 | ADD CONSTRAINT `emp_dept_mapping` FOREIGN KEY (`Dept_Id`) REFERENCES `department` (`Dept_Id`) ON DELETE NO ACTION ON UPDATE CASCADE, 108 | ADD CONSTRAINT `emp_role_mapping` FOREIGN KEY (`Role_Id`) REFERENCES `role` (`Role_Id`) ON DELETE NO ACTION ON UPDATE CASCADE; 109 | 110 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 111 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 112 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 113 | --------------------------------------------------------------------------------