myPage 프로젝트에 CRUD를 추가하는 과정을 기록한다.
게시글에 이미지를 업로드하고 다운로드하기 위해서는 enctype="multipart/form-data"
를 사용해야 했는데, 해당 타입으로 암호화하자 텍스트가 제대로 파싱되지 않았다.
따라서 텍스트를 먼저 업로드하고, 이미지 업로드 창으로 넘어가도록 하였다. 하지만 이미지를 업로드하는데에도 알맞은 변수들을 지정해 줘야 해서 이미지를 저장하는데 필요한 변수들만 새롭게 입력하도록 했다.
쿼리스트링에 folder
과 title
값이 이상한 모양으로 전송되는 것을 확인했고, 알맞게 parsing을 해줌으로써 folder
과 title
을 추출하려고 시도했다. 하지만 request가 비동기적 방법이여서인지, 두 변수가 제대로 입력되지 않았다
...
request.on('end', function(){
let post = qs.parse(body, 'name="', '"\r\n\r\n');
folder = post.folder.split('\r\n')[0];
title = post.title.split('\r\n')[0];
})
let form = new formidable.IncomingForm();
form.parse(request, function(err, fields, files){
...
}
...
사실 텍스트, 즉 폼의 값들은 fields
에 저장되어 있던 것이었다. 따라서 단순히 fields
에 있는 form
변수들을 참조하는 것으로 게시물 생성을 구현할 수 있었다.
else if(pathname === '/create_process'){
let form = new formidable.IncomingForm();
form.parse(request, function(err, fields, files){
let folder = fields.folder;
let title = fields.title;
let description = fields.description;
let oldpath = files.file.path;
let imgType = files.file.type.split('/')[1];
let newpath = `./tab/${folder}/img/${title}.${imgType}`;
fs.rename(oldpath, newpath, function(err){
fs.writeFile(`./tab/${folder}/data/${title}`, description, 'utf8', function(err){
response.writeHead(302, {'Location': `/?id=${folder}&theme=${theme}`});
response.end();
});
});
});
}
update
와 delete
분기home
에서는 create
, update
, delete
버튼 보이지 않도록 수정id(folder)
값을 hidden
으로 전송하도록 수정insight
탭에서는 column
이 3개가 아닌 2개로 나오도록 수정update
의 경우 fs.rename(oldpath, newpath, callback)
으로 기존 파일을 rename하고, fs.writeFile(newpath, description, callback)
으로 새롭게 파일을 덮어씌우는 방식으로 작업
...
fs.rename(oldpathText, newpathText, function(err){
fs.writeFile(newpathText, description, 'utf8', function(err){
fs.rename(oldpathImg, newpathImg, function(err){
...
delete
의 경우 fs.unlink(path, callback)
을 이용해서 데이터와 이미지를 모두 삭제
...
fs.unlink(`./tab/${folder}/data/${title}`, function(error){
fs.unlink(`./tab/${folder}/img/${title}.png`, function(error){
...
update
와 remove
시 이미지의 확장자를 png로 한정했다. 이미지의 확장자를. 가져오는 방법을 찾아볼 것.update
시 이미지 변경이 불가하다. 해결방안을 모색해 볼 것.column
을 이용하니까 가로로 차곡차곡 쌓이지 않고 문단처럼 왼쪽부터 채워나간다. 포스트가 많아지면 flexbox
를 사용하여 리팩토링 하는것도 고민해 볼 사항. 또한 페이지를 추가해도 좋겠다.+21.1.11: MySQL로 변경중이므로, MySQL로 이미지를 가져오는 방법을 찾아볼 것.
let template = require('./lib/template.js');
...
//main.js에서 template.js 모듈을 불러와서 사용
<form>
에 css 적용:input[type=text]{
//포커스시 발생하는 효과 제거
outline-style: none;
//둥근 모서리를 3px로
border-radius: 3px;
}
<input>
자동완성 해제://자동완성을 off로 설정
<input type="text" name="title" autocomplete='off'>
//sanitize-html을 이용해 <script> 실행을 차단
let sanitizeHtml = require('sanitize-html');
...
let sanitizeTitle = sanitizeHtml(title);
//parse를 이용해 허용되지 않은 디렉토리를 서치하는것을 보안
`let filteredTitle = parse.parse(title).base`
fs.readdir(`./tab/${filteredTitle}/data`, function(error, tempTextlist){
...
MyPage 프로젝트에 CRUD를 모두 구현했다. 하지만 아직도 nodejs 서버를 어떻게 구현하고 배포하는지를 잘 모르겠다. 프론트앤드를 목표를 하고 있지만, 서버쪽도 조금은 배워놓는게 좋을 것 같고, 동적으로 이 프로젝트를 배포해보고 싶기 때문에 서버쪽 공부가 필요해 보인다.