[Project] myPage - CRUD
➕ CRUD 추가
myPage 프로젝트에 CRUD를 추가하는 과정을 기록한다.
✔ Challenge 1 (21.1.5)
문제점
게시글에 이미지를 업로드하고 다운로드하기 위해서는 enctype="multipart/form-data"
를 사용해야 했는데, 해당 타입으로 암호화하자 텍스트가 제대로 파싱되지 않았다.
시도 1
따라서 텍스트를 먼저 업로드하고, 이미지 업로드 창으로 넘어가도록 하였다. 하지만 이미지를 업로드하는데에도 알맞은 변수들을 지정해 줘야 해서 이미지를 저장하는데 필요한 변수들만 새롭게 입력하도록 했다.
쿼리스트링에 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){
...
}
...
시도 2
사실 텍스트, 즉 폼의 값들은 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 1 (21.1.6)
변경점
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로 이미지를 가져오는 방법을 찾아볼 것.
✔ Update 2 (21.1.7)
변경점
- 모듈을 사용해 function과 변수 정리:
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){
...
✔ Finished (21.1.7)
MyPage 프로젝트에 CRUD를 모두 구현했다. 하지만 아직도 nodejs 서버를 어떻게 구현하고 배포하는지를 잘 모르겠다. 프론트앤드를 목표를 하고 있지만, 서버쪽도 조금은 배워놓는게 좋을 것 같고, 동적으로 이 프로젝트를 배포해보고 싶기 때문에 서버쪽 공부가 필요해 보인다.
Author And Source
이 문제에 관하여([Project] myPage - CRUD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@woohyun_park/Project-myPage-CRUD저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)