인프런 : https://www.inflearn.com/course/web2-node-js#
생활 코딩 : https://opentutorials.org/module/3549
소스 : https://github.com/braverokmc79/WEB2-Nodejs
App & Node.js
53.템플릿 기능 정리정돈하기
const http = require('http');
const fs = require('fs');
const url = require("url");
const qs = require("querystring");
const template = {
HTML: function (title, menuList, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
<ol>${menuList}</ol>
${body}
</body>
</html>
`;
},
list: function (filelist) {
let menuList = "";
filelist.forEach(item => {
menuList += `<li><a href="/?id=${item}">${item}</a></li>`;
})
return menuList;
},
page: function commonPage(queryData, response, head, body) {
const _this = this;
fs.readFile(`../data/${queryData.id}`, 'utf-8', function (err, description) {
let title = queryData.id;
if (head === "main") {
if (queryData.id === undefined) {
title = "Welcome";
description = "Hello, Node.js";
body = `<a href="/create">create</a><h2>${title}</h2>${description}`;
} else {
body = `<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form method="post" action="/delete_proecess">
<input type="hidden" name="id" value='${title}' >
<input type="submit" value="delete" style="">
</form>
<h2>${title}</h2>${description}`;
}
} else if (head === "create") {
title = "CREATE";
} else if (head === "update") {
body = `<form action="/update_process" method="post">
<p><input type="hidden" name="id" value='${title}' ></p>
<p><input type="text" name="title" value='${title}'></p>
<p><textarea name="description" style="width:200px; height:150px" >${description}</textarea></p>
<p><input type="submit" value="수정하기"></p>
</form>`;
}
const menuList = _this.list(fs.readdirSync('../data'));
const endTemp = _this.HTML(title, menuList, body);
response.writeHead(200);
response.end(endTemp);
});
}
}
const app = http.createServer(function (request, response) {
const _url = request.url;
const queryData = url.parse(_url, true).query;
const pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
template.page(queryData, response, "main", "");
} else if (pathname === '/create') {
template.page(queryData, response, "create", `<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder=""></p>
<p><textarea name="description" style="width:200px; height:150px" ></textarea></p>
<p><input type="submit"></p>
</form>`);
} else if (pathname === '/create_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let title = post.title;
let description = post.description;
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
});
} else if (pathname === '/update') {
template.page(queryData, response, "update", null);
} else if (pathname === '/update_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
const id = post.id;
const title = post.title;
const description = post.description;
fs.rename(`../data/${id}`, `../data/${title}`, function (err) {
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
})
});
} else if (pathname === '/delete_proecess') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
const id = post.id;
fs.unlink(`../data/${id}`, function (error) {
response.writeHead(302, { Location: `/` });
response.end("success");
});
});
} else {
response.writeHead(400);
response.end("Not found");
}
});
app.listen(3000);
54.Node.js 모듈의형식
mpart.js
var M = {
v: 'V',
f: function () {
console.log(this.v);
}
}
module.exports = M;
muse.js
var part = require('./mpart.js');
part.f();
55.모듈의 활용
lib/template.js
const fs = require('fs');
module.exports = {
HTML: function (title, menuList, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
<ol>${menuList}</ol>
${body}
</body>
</html>
`;
},
list: function (filelist) {
let menuList = "";
filelist.forEach(item => {
menuList += `<li><a href="/?id=${item}">${item}</a></li>`;
})
return menuList;
},
page: function commonPage(queryData, response, head, body) {
const _this = this;
fs.readFile(`../data/${queryData.id}`, 'utf-8', function (err, description) {
let title = queryData.id;
if (head === "main") {
if (queryData.id === undefined) {
title = "Welcome";
description = "Hello, Node.js";
body = `<a href="/create">create</a><h2>${title}</h2>${description}`;
} else {
body = `<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form method="post" action="/delete_proecess">
<input type="hidden" name="id" value='${title}' >
<input type="submit" value="delete" style="">
</form>
<h2>${title}</h2>${description}`;
}
} else if (head === "create") {
title = "CREATE";
} else if (head === "update") {
body = `<form action="/update_process" method="post">
<p><input type="hidden" name="id" value='${title}' ></p>
<p><input type="text" name="title" value='${title}'></p>
<p><textarea name="description" style="width:200px; height:150px" >${description}</textarea></p>
<p><input type="submit" value="수정하기"></p>
</form>`;
}
const menuList = _this.list(fs.readdirSync('../data'));
const endTemp = _this.HTML(title, menuList, body);
response.writeHead(200);
response.end(endTemp);
});
}
}
app.js
const http = require('http');
const fs = require('fs');
const url = require("url");
const qs = require("querystring");
const template = require("../lib/template");
const app = http.createServer(function (request, response) {
const _url = request.url;
const queryData = url.parse(_url, true).query;
const pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
template.page(queryData, response, "main", "");
} else if (pathname === '/create') {
template.page(queryData, response, "create", `<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder=""></p>
<p><textarea name="description" style="width:200px; height:150px" ></textarea></p>
<p><input type="submit"></p>
</form>`);
} else if (pathname === '/create_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let title = post.title;
let description = post.description;
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
});
} else if (pathname === '/update') {
template.page(queryData, response, "update", null);
} else if (pathname === '/update_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
const id = post.id;
const title = post.title;
const description = post.description;
fs.rename(`../data/${id}`, `../data/${title}`, function (err) {
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
})
});
} else if (pathname === '/delete_proecess') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
const id = post.id;
fs.unlink(`../data/${id}`, function (error) {
response.writeHead(302, { Location: `/` });
response.end("success");
});
});
} else {
response.writeHead(400);
response.end("Not found");
}
});
app.listen(3000);
56.입력정보에 대한 보안
template.js
const fs = require('fs');
const path = require("path");
module.exports = {
HTML: function (title, menuList, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
<ol>${menuList}</ol>
${body}
</body>
</html>
`;
},
list: function (filelist) {
let menuList = "";
filelist.forEach(item => {
menuList += `<li><a href="/?id=${item}">${item}</a></li>`;
})
return menuList;
},
page: function commonPage(queryData, response, head, body) {
const _this = this;
const filteredId = path.parse(queryData.id + "").base;
fs.readFile(`../data/${filteredId}`, 'utf-8', function (err, description) {
let title = queryData.id;
if (head === "main") {
if (queryData.id === undefined) {
title = "Welcome";
description = "Hello, Node.js";
body = `<a href="/create">create</a><h2>${title}</h2>${description}`;
} else {
body = `<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form method="post" action="/delete_proecess">
<input type="hidden" name="id" value='${title}' >
<input type="submit" value="delete" style="">
</form>
<h2>${title}</h2>${description}`;
}
} else if (head === "create") {
title = "CREATE";
} else if (head === "update") {
body = `<form action="/update_process" method="post">
<p><input type="hidden" name="id" value='${title}' ></p>
<p><input type="text" name="title" value='${title}'></p>
<p><textarea name="description" style="width:200px; height:150px" >${description}</textarea></p>
<p><input type="submit" value="수정하기"></p>
</form>`;
}
const menuList = _this.list(fs.readdirSync('../data'));
const endTemp = _this.HTML(title, menuList, body);
response.writeHead(200);
response.end(endTemp);
});
}
}
app.js
const http = require('http');
const fs = require('fs');
const url = require("url");
const qs = require("querystring");
const template = require("../lib/template");
const path = require("path");
const app = http.createServer(function (request, response) {
const _url = request.url;
const queryData = url.parse(_url, true).query;
const pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
template.page(queryData, response, "main", "");
} else if (pathname === '/create') {
template.page(queryData, response, "create", `<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder=""></p>
<p><textarea name="description" style="width:200px; height:150px" ></textarea></p>
<p><input type="submit"></p>
</form>`);
} else if (pathname === '/create_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let title = post.title;
let description = post.description;
title = path.parse(title).base;
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
});
} else if (pathname === '/update') {
template.page(queryData, response, "update", null);
} else if (pathname === '/update_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let id = post.id;
let title = post.title;
const description = post.description;
id = path.parse(id + "").base;
title = path.parse(title).base;
fs.rename(`../data/${id}`, `../data/${title}`, function (err) {
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
})
});
} else if (pathname === '/delete_proecess') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let id = post.id;
id = path.parse(id + "").base;
fs.unlink(`../data/${id}`, function (error) {
response.writeHead(302, { Location: `/` });
response.end("success");
});
});
} else {
response.writeHead(400);
response.end("Not found");
}
});
app.listen(3000);
57.출력정보에 대한 보안(1/3)
58.출력정보에 대한 보안(2/3)
$ npm init -y
$ npm i sanitize-html
59.출력정보에 대한 보안(3/3)
app.js
~
} else if (pathname === '/create_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let title = sanitizeHtml(post.title);
let description = sanitizeHtml(post.description);
title = path.parse(title).base;
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
});
} else if (pathname === '/update') {
template.page(queryData, response, "update", null);
} else if (pathname === '/update_process') {
let body = "";
request.on("data", function (data) {
body = body + data;
});
request.on("end", function (data) {
const post = qs.parse(body);
let id = post.id;
let title = sanitizeHtml(post.title);
let description = sanitizeHtml(post.description);
id = path.parse(id + "").base;
title = path.parse(title).base;
fs.rename(`../data/${id}`, `../data/${title}`, function (err) {
fs.writeFile(`../data/${title}`, description, 'utf8', function (err) {
response.writeHead(302, { Location: `/?id=${title}` });
response.end("success");
})
})
});
} else if (pathname === '/delete_proecess') {
~
60.API와 CreateServer
61.수업을 마치며













댓글 ( 4)
댓글 남기기