생활코딩 WEB2 - Node.js 강의노트 - 끝까지
31강 25.1. JavaScript 함수의 기본 문법
f123();
console.log("Test1");
f123();
console.log("Test2");
f123();
console.log("Test3");
function f123() {
console.log(1);
console.log(2);
console.log(3);
console.log(4);
}
32강 25.2. JavaScript 함수의 입력
console.log(Math.round(1.6)); // 2
console.log(Math.round(1.4)); // 1
function sum(first, second) { // parameter
console.log(first+second);
}
sum(2, 4); // 6 // argument
33강 25.3. JavaScript-함수의 출력
function sum2(first, second) {
return first + second;
}
console.log(sum2(4,5)); // 9
34강 26. App 제작-함수를 이용해서 정리 정돈하기
var http = require('http');
var fs = require('fs');
var url = require('url');
function templateHTML(title, list, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
});
}
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
35강 27. 수업의 정상
- 이제 본격적으로 시작 !!!!
36강 28.1. Nodejs에서 동기와 비동기 1
- synchronous & asynchronous
- Nodejs는 비동기적 처리를 하기 위한 좋은 기능을 가지고 있다.
37강 28.2. Nodejs에서 동기와 비동기 2
var fs = require('fs');
/*
// readFileSync
console.log('A');
var result = fs.readFileSync('syntax/sample.txt', 'utf8'); // 동기, 리턴한다
console.log(result);
console.log('C');
출력:
A
B
C
*/
console.log('A');
fs.readFile('syntax/sample.txt', 'utf8', function(err, result) {
console.log(result);
}); // 비동기, readFile은 리턴하지 않는다.
console.log('C');
// 출력
// A
// C
// B
38강 28.3. JavaScript-callback
/*
function a() {
console.log('A');
}
*/
var a = function() {
console.log('A');
}
function slowfunc(callback) {
callback();
}
slowfunc(a);
39강 29. Node.js의 패키지 매니저와 PM2
npm install pm2 -g
PS C:\Users\spec0\Desktop\Project\2021\03\nodejs> npm install pm2 -g
npm WARN notice [SECURITY] lodash has the following vulnerability: 1 high. Go here for more details: https://www.npmjs.com/advisories?search=lodash&version=4.17.21 - Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
C:\Users\spec0\AppData\Roaming\npm\pm2 -> C:\Users\spec0\AppData\Roaming\npm\node_modules\pm2\bin\pm2
C:\Users\spec0\AppData\Roaming\npm\pm2-dev -> C:\Users\spec0\AppData\Roaming\npm\node_modules\pm2\bin\pm2-dev
C:\Users\spec0\AppData\Roaming\npm\pm2-runtime -> C:\Users\spec0\AppData\Roaming\npm\node_modules\pm2\bin\pm2-runtime
C:\Users\spec0\AppData\Roaming\npm\pm2-docker -> C:\Users\spec0\AppData\Roaming\npm\node_modules\pm2\bin\pm2-docker
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.3.1 (node_modules\pm2\node_modules\chokidar\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","npm WARN ws@7.2.5 requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN ws@7.2.5 requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.
+ pm2@4.5.6
added 175 packages in 10.175s
pm2 설치
pm2 start main.js
PS C:\Users\spec0\Desktop\Project\2021\03\nodejs> pm2 start main.js
[PM2] Spawning PM2 daemon with pm2_home=C:\Users\spec0\.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting C:\Users\spec0\Desktop\Project\2021\03\nodejs\main.js in fork_mode (1 instance)
[PM2] Done.
┌─────┬─────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼─────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ main │ default │ N/A │ fork │ 8520 │ 0s │ 0 │ online │ 0% │ 30.7mb │ spec0 │ disabled │
└─────┴─────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
pm2 monit
pm2 list
pm2 stop main
pm2 start main.js --watch
수정 후 node 재시작 없이 리로드 하면 바로 반영
pm2 log
로그를 볼 수 있음
40강 30. HTML-form
<form action="http://localhost:3000/process_create" method="post">
<p><input type="text" name="title"></p>
<p>
<textarea name="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
서버에 데이터를 수정, 삭제, 생성 같은걸 할 때는 method를 post로 해야 한다 !!! (보안 상에 이유, 데이터를 get으로 보내면 짤릴 수 있다. 너무 큰 데이터일 때)
41강 31. App 제작-글생성 UI 만들기
var http = require('http');
var fs = require('fs');
var url = require('url');
function templateHTML(title, list, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
<a href="/create">create</a>
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="http://localhost:3000/process_create" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`);
response.writeHead(200);
response.end(template);
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 결과
42강 32. App 제작-POST 방식으로 전송된 데이터 받기
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring'); // 새로 생긴 부분
function templateHTML(title, list, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
<a href="/create">create</a>
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="http://localhost:3000/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`);
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
console.log(post); // { title: 'nodejs', description: 'nodejs is ...' } 출력
});
response.writeHead(200);
response.end('success');
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 로그를 찍으면 나오는 결과
43강 33. App 제작-파일생성과 리다이렉션
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
<a href="/create">create</a>
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="http://localhost:3000/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`);
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 결과
44강 34. App 제작-글수정-수정링크생성
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="http://localhost:3000/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 홈 디렉토리에는 update 버튼이 없다.
- 각 파일로 들어갈 시 update 버튼(링크)이 생긴다.
- 버튼 클릭시 링크 확인하기
45강 35. App 제작-글수정-수정할 정보 전송
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- update 수행 시 submit 버튼 누르면 id, title, description이 post로 넘어간다. {name: value}로
46강 36. App 제작-글수정-파일명 변경, 내용저장
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
}else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 결과
47강 37. App 제작-글삭제-삭제버튼 구현
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
}else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 결과
48강 38. App 제작-글삭제 기능 완성
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function templateHTML(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
}
function templateList(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(template);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(template);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = templateList(filelist);
var template = templateHTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(template);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = templateList(filelist);
var template = templateHTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(template);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
} else if (pathname === '/delete_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
fs.unlink(`data/${id}`, function(error) {
response.writeHead(302, {Location: `/`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
-
결과
- mongoDB 문서의 delete 버튼을 누른다.
- 삭제된다
49강 39. JavaScript 객체의 형식
// Array
var members = ['egoing', 'k8805', 'hoya'];
console.log(members[1]); // k8805
// Object
var roles = {
'programmer':'egoing',
'designer':'k8805',
'manager':'hoya'
}
console.log(roles.designer); // k8805
50강 40. JavaScript-객체-반복
// Array
var members = ['egoing', 'k8805', 'hoya'];
console.log(members[1]); // k8805
/*
array loop egoing
array loop k8805
array loop hoya
*/
var i = 0;
while(i < members.length) {
console.log('array loop', members[i]);
i = i + 1;
}
// Object
var roles = {
'programmer':'egoing',
'designer':'k8805',
'manager':'hoya'
}
console.log(roles.designer); // k8805
console.log(roles['designer']); // k8805
/*
object => programmer value => egoing
object => designer value => k8805
object => manager value => hoya
*/
for (var name in roles) {
console.log('object => ', name, 'value => ', roles[name]);
}
51강 41. JavaScript-객체-값으로서 함수
-
if나 while문 같은 경우는 statement를 값으로 할당할 수 없다.
-
함수는 값으로 할당할 수 있다.
var f = function () {
console.log(1+1);
console.log(1+2);
}
console.log(f); // [Function: f]
/*
2
3
*/
f();
/*
2
3
*/
var a = [f]; // 배열
a[0]();
/*
2
3
*/
var o = { // 객체
func:f
}
o.func();
52강 42. JavaScript-객체-데이터와 처리 방법을 담는 그릇으로서 객체
var o = {
v1:'v1',
v2:'v2',
f1:function () {
console.log(this.v1);
},
f2:function () {
console.log(this.v2);
}
}
/*
출력
v1
v2
*/
o.f1();
o.f2();
53강 43. App제작-템플릿 기능 정리정돈하기
- 객체에 프로퍼티를 사용해 코드 리펙토링
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
var template = {
HTML:function(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB1 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
},
list:function(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
}
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(html);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
} else if (pathname === '/delete_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
fs.unlink(`data/${id}`, function(error) {
response.writeHead(302, {Location: `/`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
“처음부터 이상적인 코드를 짤려고 하면 한 줄도 짤 수 없을 수 있다. 또 내가 하는 코딩이 즐겁지 않고 내가 만든 결과물이 부끄러울 수 있다. 그래서는 생산자가 되기 어렵다.”
54강 44. Node.js 모듈의형식
- mpart.js
// mpart.js
var M = {
v:'v',
f:function(){
console.log(this.v);
}
}
// M 객체를 바깥에서 이용하게 하겠다.
module.exports = M;
- muse.js
// muse.js
var part = require('./mpart.js');
console.log(part); // { v: 'v', f: [Function: f] }
part.f(); // v
55강 45. App 제작 - 모듈의 활용
- lib/template.js
module.exports = {
HTML:function(title, list, body, control) {
return `
<!doctype html>
<html>
<head>
<title>WEB2 - ${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">WEB</a></h1>
${list}
${control}
${body}
</body>
</html>
`;
},
list:function(filelist) {
var list = '<ul>';
var i = 0;
while(i < filelist.length) {
list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
i = i + 1;
}
list = list + '</ul>';
return list;
}
}
- main.js
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
var template = require('./lib/template.js'); // 강조
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
} else {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(html);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
} else if (pathname === '/delete_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
fs.unlink(`data/${id}`, function(error) {
response.writeHead(302, {Location: `/`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
56강 46. App 제작-입력정보에 대한 보안
회원정보를 담는 password.js라는 파일이 있고
127.0.0.1:3000/?id=../password.js
치면 민감한 정보가 노출된다.
해당 이슈를 막자!!!
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
var template = require('./lib/template.js');
var path = require('path');
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
} else {
fs.readdir('./data', function(error, filelist) {
var filteredId = path.parse(queryData.id).base; // 강조
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description) { // 강조
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
var filteredId = path.parse(queryData.id).base; // 강조
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description) { // 강조
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(html);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
} else if (pathname === '/delete_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var filteredId = path.parse(id).base; // 강조
fs.unlink(`data/${filteredId}`, function(error) {
response.writeHead(302, {Location: `/`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
- 개인정보가 노출되지 않게 보안 강화한 모습
57강 47.1. App제작-출력정보에 대한 보안
- 수동으로 꺽쇠를 바꿔주는 방법
// data/XSS
<script>
alert('merong');
</script>
58강 47.2. App제작-출력정보에 대한 보안
- npm init (묻는거 다 yes or 엔터키)
PS C:\Users\spec0\Desktop\Project\2021\03\nodejs> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (nodejs)
version: (1.0.0)
description:
entry point: (main.js)
test command:
git repository: (https://github.com/jh2song/WEB2-Nodejs.git)
keywords:
author:
license: (ISC)
About to write to C:\Users\spec0\Desktop\Project\2021\03\nodejs\package.json:
{
"name": "nodejs",
"version": "1.0.0",
"description": "",
"main": "main.js",
"directories": {
"lib": "lib"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/jh2song/WEB2-Nodejs.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/jh2song/WEB2-Nodejs/issues"
},
"homepage": "https://github.com/jh2song/WEB2-Nodejs#readme"
}
Is this ok? (yes) yes
package.json이 생성!!!
- npm install -S sanitize-html (pm2 깔때 쓴 -g는 모든 프로젝트 환경에서 쓴다는 것이고 -S는 독립된 프로젝트 내에서 쓴다는 말이다.)
PS C:\Users\spec0\Desktop\Project\2021\03\nodejs> npm install -S sanitize-html
(node_modules)-(sanitize-html)라는 디렉토리 생성!!!
- 현재 디렉토리 구조
59강 47.3. App제작-출력정보에 대한 보안
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
var template = require('./lib/template.js');
var path = require('path');
var sanitizeHtml = require('sanitize-html');
var app = http.createServer(function(request, response) {
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if (pathname === '/') {
if (queryData.id === undefined) { // 홈일 때
fs.readdir('./data', function(error, filelist) {
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list, `<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
} else {
fs.readdir('./data', function(error, filelist) {
var filteredId = path.parse(queryData.id).base;
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description) {
var title = queryData.id;
// 강조
var sanitizedTitle = sanitizeHtml(title);
var sanitizedDescription = sanitizeHtml(description, {
allowedTags:['h1']
});
var list = template.list(filelist);
var html = template.HTML(sanitizedTitle, list, `<h2>${sanitizedTitle}</h2>${sanitizedDescription}`,
`<a href="/create">create</a>
<a href="/update?id=${sanitizedTitle}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${sanitizedTitle}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
} else if (pathname === '/create') {
fs.readdir('./data', function(error, filelist) {
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
} else if (pathname === '/create_process') { // post로 값 받기
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
} else if (pathname === '/update') {
fs.readdir('./data', function(error, filelist) {
var filteredId = path.parse(queryData.id).base;
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description) {
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(html);
});
});
} else if (pathname === '/update_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error) {
fs.writeFile(`data/${title}`, description, 'utf8', function(err) {
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
});
});
});
} else if (pathname === '/delete_process') {
var body = '';
request.on('data', function(data) {
body = body + data;
});
request.on('end', function() {
var post = qs.parse(body);
var id = post.id;
var filteredId = path.parse(id).base;
fs.unlink(`data/${filteredId}`, function(error) {
response.writeHead(302, {Location: `/`});
response.end();
});
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
60강 48. API와 CreateServer
생략
61강 49. 수업을마치며
생략
62강 Long take
생략
63강 49. 부록 - pm2 보충학습
-
daemon: 백그라운드로 실행되는 프로그램
-
main.js를 pm2로 실행하는데 항상성을 유지하고 백그라운드로 실행하지 않는 명령어
pm2 start main.js --watch --no-daemon
- data, sessions 디렉토리에 대한 watch(항상성)을 하지 않도록 하는 명령어
pm2 start main.js --watch --ignore-watch="data/* sessions/*" --no-daemon