nodeJS를 이용한 CRUD
1. nodeJS 기초
1) 웹 서버 구동하는 법
require
을 사용하여 라이브러리를 불러옵니다.
createServer
을 사용하여 서버를 만듭니다.
request.url
을 사용해, 사용자가 요청한 url 주소를 받아옵니다.
if(request.url === '/')
만약 사용자가 요청한 url주소가 /
이면 index.html을 화면에 띄웁니다.
var http = require('http');
var fs = require('fs');
var url = require('url');
var app = http.createServer(function(request, response){
var urls = request.url;
var queryData = url.parse(urls, true).query;
if(request.url === '/'){
url = '/index.html';
}
if(request.url === '/favicon.ico'){
return response.writeHead(404);
}
response.writeHead(200);
response.end(queryData.id)
});
app.listen(3000);
2) 동적엔 웹사이트의 시작
- `을 사용해서 nodeJS에서 html 코드 사용이 가능합니다.
- html코드안에서 변수는
${변수명}
형태로 사용합니다.
var http = require('http');
var fs = require('fs');
var url = require('url');
var app = http.createServer(function(request, response){
var urls = request.url;
var queryData = url.parse(urls, true).query;
var title = queryData.id;
if(urls === '/'){
title = 'hi';
}
if(urls === '/favicon'){
return response.writeHead(404);
}
response.writeHead(200);
var template = `
<head>
<title>${title}</title>
</head>
<body>
<h1><a href="/">WEBSITE</a></h1>
<ul>
<li><a href="/?id=HTML">HTML</a></li>
<li><a href="/?id=CSS">CSS</a></li>
<li><a href="/?id=JS">JS</a></li>
</ul>
<h2>${title}</h2>
<p>this is description</p>
</body>
`;
response.end(template);
});
app.listen(3000);
3) 외부 파일 읽는 법
require('fs')
모듈을 불러옵니다.
fs.readFile(파일명, 문자인코딩, 콜백함수)
를 사용하여 파일에서 읽은 내용을 사용합니다.
const fs = require('fs');
fs.readFile('sample.txt', 'utf-8', (err,data)=>{
if (err) throw err;
console.log(data);
});
var fs = require('fs');
fs.readFile('file.txt', 'utf8', function(err, data){
console.log(data);
});
2. CRUD
1) BASIC
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
function
을 정의하여 중복된 코드를 함수화시킵니다.
function templateHTML(title, list, body, control){
return `
<head>
<title>WEB-${title}</title>
<meta charset="utf-8">
</head>
<body>
<h1><a href="/">HOME</a></h1>
${list}
${control}
${body}
</body>
`
}
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;
}
createServer
을 사용하여 서버를 구동합니다.
readdir
을 사용하여 디렉토리 안에 있는 파일에 접근합니다.
var app = http.createServer(request, response){
var urls = request.url;
var queryData = url.parse(urls, true).query;
var pathname = url.parse(urls, true).pathname;
if(pathname === '/'){
if(pathData.id === undefined){
fs.readdir('./data', finction(err, filelist){
var title = 'HOME, HI';
var desc = 'HELLO WOELD';
var list =templateList(filelist);
var template = templateHTML(title, list,
`<h2>${title}</h2> <p>${desc}</p>`,
`<a href = "/create">create</a>`)
});
response.writeHead(200);
response.end(template);
}
else{
fs.readdir('./data', finction(err, filelist){
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, desc){
var list = templateList(filelist);
var title = queryData.id;
var template = templateHTML(title, list,
`<h2>${title}</h2> <p>${desc}</p>`,
`
<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);
});
});
....
}
}
}
2) CREARE
create
버튼을 클릭했을 때, 구동되는 코드입니다.
- 버튼 클릭시, 글을 작성하는 페이지로 이동합니다.
- 글작성 후
submit
을 클릭하여 create_process
코드가 작동됩니다.
else if(pathname==='/create'){
fs.readdir('./data', function(err, 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="desc" placeholder="desc"></textarea></p>
<p><input type="submit"></p>
</form>
`,'');
response.writeHead(200);
response.end(template);
});
}else if(pathname === '/create_process'){
var body = '';
request.on('data', function(data){
body = body + data;
if(body.length > 1e6){
request.connection.destroy();
}});
request.on('end', function(){
var post = qs.parse(body);
var title = post.title;
var desc = post.desc;
fs.writeFile(`data/${title}`, desc, 'utf8', function(err){
response.writeHead(302, {Location : `/?id=${title}`});
response.end('success');
})
})
} ....
3) UDATE
readdir
을 사용하여 폴더에 접근하여 파일 리스트를 화면에 출력합니다.
readFile
을 사용하여 기존 데이터를 form에 placeholder로 둡니다.
- 사용자는
update_process
버튼을 통해 데이터를 수정합니다.
- 식별자는
id
로 초기 데이터의 제목입니다.
else if(pathname==="/update"){
fs.readdir('./data', function(error, filelist){
var list = templateList(filelist);
fs.readFile(`data/${queryData.id}`, 'utf8', function(err, desc){
var title = queryData.id;
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="desc" placeholder="desc">${desc}</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 += data;
if(body.length > 1e6){
request.connection.destroy();
}
});
request.on('end', function(){
var post = qs.parse(body);
var title = post.title;
var desc = post.desc;
var id = post.id;
fs.rename(`data/${id}`, `data/${title}`, function(err){
fs.writeFile(`data/${title}`, desc, 'utf8', function(err){
response.writeHead(302, {Location : `/?id=${title}`});
response.end('success');
})
})
})
} ...
4) DELETE
fs.unlink
를 사용하여 파일을 삭제합니다.
else if(pathname === '/delete_process'){
var body = '';
request.on('data', function(data){
body += data;
});
request.on('end', function(){
var post = qs.parse(body);
var id = post.id;
fs.unlink(`data/${id}`, function(err){
response.writeHead(302, {Location : '/'});
response.end();
})
})
}
else {
response.writeHead(404);
response.end('Not found');
}