├── public └── css │ └── style.css ├── views ├── header.ejs ├── index.ejs └── body.ejs ├── data └── user.json ├── package.json ├── README.md ├── server.js └── router └── main.js /public/css/style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background-color: black; 3 | color: white; 4 | } 5 | -------------------------------------------------------------------------------- /views/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | <%= title %> 3 | 4 | 5 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <% include ./header %> 4 | 5 | 6 | <% include ./body %> 7 | 8 | 9 | -------------------------------------------------------------------------------- /data/user.json: -------------------------------------------------------------------------------- 1 | { 2 | "newuser": { 3 | "password": "changedpass", 4 | "name": "david" 5 | }, 6 | "velopert": { 7 | "password": "123123", 8 | "name": "M.J. KIM" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-tutorial", 3 | "version": "1.0.0", 4 | "dependencies": 5 | { 6 | "express": "~4.13.1", 7 | "ejs": "~2.4.1" , 8 | "body-parser": "~1.14.2", 9 | "express-session": "~1.13.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /views/body.ejs: -------------------------------------------------------------------------------- 1 |

Loop it!

2 | 9 | 10 | <% if(username){ %> 11 |

Welcome! <%= username %> (name: <%= name %>)

12 | <% }else{ %> 13 |

Please Login.

14 | <% } %> 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # express-tutorial 2 | VELOPERT 블로그에 작성한 ExpressJS 강좌에 사용된 프로젝트 입니다. 3 | Node.js 와 Express.js 의 기초를 다지는데 목적을 두었으므로 소스코드의 보안 및 실용성은 다소 낮습니다. 4 | 5 | 프로젝트에서 다루는 개념은 Express 프로젝트 환경 설정 및 EJS, RESTful API, express-session 입니다. 6 | 7 | - [\[Node.JS\] 강좌 09편: Express 프레임워크 사용해보기](https://velopert.com/294) 8 | - [\[Node.JS\] 강좌 10-1편: Express 프레임워크 응용하기 – EJS](https://velopert.com/294) 9 | - [\[Node.JS\] 강좌 10-2편: Express 프레임워크 응용하기 – RESTful API 편](https://velopert.com/332) 10 | - [\[Node.JS\] 강좌 10-3편: Express 프레임워크 응용하기 – express-session 편](https://velopert.com/406) 11 | 12 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var bodyParser = require('body-parser'); 4 | var session = require('express-session'); 5 | var fs = require("fs"); 6 | 7 | app.set('views', __dirname + '/views'); 8 | app.set('view engine', 'ejs'); 9 | app.engine('html', require('ejs').renderFile); 10 | 11 | 12 | var server = app.listen(3000, function(){ 13 | console.log("Express server has started on port 3000") 14 | }); 15 | 16 | app.use(express.static('public')); 17 | 18 | app.use(bodyParser.json()); 19 | app.use(bodyParser.text()); 20 | app.use(bodyParser.urlencoded()); 21 | app.use(session({ 22 | secret: '@#@$MYSIGN#@$#$', 23 | resave: false, 24 | saveUninitialized: true 25 | })); 26 | 27 | 28 | var router = require('./router/main')(app, fs); 29 | -------------------------------------------------------------------------------- /router/main.js: -------------------------------------------------------------------------------- 1 | module.exports = function(app, fs) 2 | { 3 | var userjsonDir = __dirname + "/../data/user.json"; 4 | 5 | app.get('/',function(req,res){ 6 | var sess = req.session; 7 | 8 | res.render('index', { 9 | title: "MY HOMEPAGE", 10 | length: 5, 11 | name: sess.name, 12 | username: sess.username 13 | }) 14 | }); 15 | 16 | app.get('/list', function (req, res) { 17 | 18 | fs.readFile( userjsonDir, 'utf8', function (err, data) { 19 | res.end( data ); 20 | }); 21 | }); 22 | 23 | app.get('/getUser/:username', function(req, res){ 24 | fs.readFile(userjsonDir, 'utf8', function (err, data) { 25 | var users = JSON.parse(data); 26 | res.json(users[req.params.username]); 27 | }); 28 | }); 29 | 30 | app.post('/addUser/:username', function(req, res){ 31 | 32 | var result = { }; 33 | var username = req.params.username; 34 | 35 | // CHECK REQ VALIDITY 36 | if(!req.body["password"] || !req.body["name"]){ 37 | result["success"] = 0; 38 | result["error"] = "invalid request"; 39 | res.json(result); 40 | return; 41 | } 42 | 43 | // LOAD DATA & CHECK DUPLICATION 44 | fs.readFile(userjsonDir, 'utf8', function(err, data){ 45 | var users = JSON.parse(data); 46 | if(users[username]){ 47 | // DUPLICATION FOUND 48 | result["success"] = 0; 49 | result["error"] = "duplicate"; 50 | res.json(result); 51 | return; 52 | } 53 | 54 | // ADD TO DATA 55 | users[username] = req.body; 56 | 57 | // SAVE DATA 58 | fs.writeFile(userjsonDir, 59 | JSON.stringify(users, null, '\t'), "utf8", function(err, data){ 60 | result = {"success": 1}; 61 | res.json(result); 62 | }) 63 | }) 64 | }); 65 | 66 | 67 | app.put('/updateUser/:username', function(req, res){ 68 | 69 | var result = { }; 70 | var username = req.params.username; 71 | 72 | // CHECK REQ VALIDITY 73 | if(!req.body["password"] || !req.body["name"]){ 74 | result["success"] = 0; 75 | result["error"] = "invalid request"; 76 | res.json(result); 77 | return; 78 | } 79 | 80 | // LOAD DATA 81 | fs.readFile(userjsonDir, 'utf8', function(err, data){ 82 | var users = JSON.parse(data); 83 | // ADD/MODIFY DATA 84 | users[username] = req.body; 85 | 86 | // SAVE DATA 87 | fs.writeFile(userjsonDir, 88 | JSON.stringify(users, null, '\t'), "utf8", function(err, data){ 89 | result = {"success": 1}; 90 | res.json(result); 91 | }) 92 | }) 93 | }); 94 | 95 | 96 | app.delete('/deleteUser/:username', function(req, res){ 97 | var result = { }; 98 | //LOAD DATA 99 | fs.readFile(userjsonDir, "utf8", function(err, data){ 100 | var users = JSON.parse(data); 101 | 102 | // IF NOT FOUND 103 | if(!users[req.params.username]){ 104 | result["success"] = 0; 105 | result["error"] = "not found"; 106 | res.json(result); 107 | return; 108 | } 109 | 110 | // DELETE FROM DATA 111 | delete users[req.params.username]; 112 | 113 | // SAVE FILE 114 | fs.writeFile(userjsonDir, 115 | JSON.stringify(users, null, '\t'), "utf8", function(err, data){ 116 | result["success"] = 1; 117 | res.json(result); 118 | return; 119 | }) 120 | }) 121 | 122 | }); 123 | 124 | app.get('/login/:username/:password', function(req, res){ 125 | var sess; 126 | sess = req.session; 127 | 128 | fs.readFile(userjsonDir, "utf8", function(err, data){ 129 | var users = JSON.parse(data); 130 | var username = req.params.username; 131 | var password = req.params.password; 132 | var result = {}; 133 | if(!users[username]){ 134 | // USERNAME NOT FOUND 135 | result["success"] = 0; 136 | result["error"] = "not found"; 137 | res.json(result); 138 | return; 139 | } 140 | 141 | if(users[username]["password"] == password){ 142 | result["success"] = 1; 143 | sess.username = username; 144 | sess.name = users[username]["name"]; 145 | res.json(result); 146 | 147 | }else{ 148 | result["success"] = 0; 149 | result["error"] = "incorrect"; 150 | res.json(result); 151 | } 152 | }) 153 | }); 154 | 155 | app.get('/logout', function(req, res){ 156 | sess = req.session; 157 | if(sess.username){ 158 | req.session.destroy(function(err){ 159 | if(err){ 160 | console.log(err); 161 | }else{ 162 | res.redirect('/'); 163 | } 164 | }) 165 | }else{ 166 | res.redirect('/'); 167 | } 168 | }) 169 | } 170 | --------------------------------------------------------------------------------