├── 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 |
3 | <% for(var i=0; i
4 | -
5 | <%= "LOOP" + i %>
6 |
7 | <% } %>
8 |
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 |
--------------------------------------------------------------------------------