본문 바로가기

Nodejs

[Node.js] 서버에 데이터 저장 (파일로 저장)

파일로 데이터 저장하기 (데이터 입력)

//app.js
const fs = require('fs');
app.set('views'. './views_file');
app.set('view engine', 'jade');
app.post('/topic', function(req,res){
    const title = req.body.title;
    const desc = req.body.desc;
    fs. writeFile('data/'+title, desc, function(err){
    	if(err){
        	console.log(err);
    		res.status(500).send('Internal Server Error');  	// status(500) : 오류 
    	}
    	res.send('Success!');
    });
    }
})


//form.jade
doctype html
html 
    body
    	form(action = '/form_receiver'. method='post')
        	p
            	input(type = "text" name = 'title')
            	p
            	textarea(name = 'desc')

 

 

파일로 저장된 데이터 읽어오기 (데이터 출력)

1. topic 페이지에 데이터 목록 만들기 

//app.js
app.get('/topic', function(req,res){
	fs.readdir('data', function(err, files){ //읽어올 폴더명, 읽어온 후 결과(err, 결과 list객체)가 들어간 callback함수
    	if(err){
    		console.log(err);
            	res.status(500).send("Internal Server Error");
        }
    	res.render('view',{topics:files});	//렌더링 할 jade 파일명, jade파일로 보내줄 데이터가 들어간 객체
    						//readdir 결과인 files를 topics이라는 이름으로 jade파일로 전달
	})
});



//.views_file/view.jade

doctype html
html 
    body
    	ul
        	each topic in topics
            	li 
                	a(href="/topic/"+topic)=topic     	//=은 변수라는 뜻

 

jade 결과

jade 결과

 

 

2. topic/:id에서 desc 읽기 

//app.js
app.get('/topic/:id', funciont(req,res){
	const id = req.params.id;
    fs.readdir('data', function(err, files){ //읽어올 폴더명, 읽어온 후 결과(err, 결과 list객체)가 들어간 callback함수
    	if(err){
    		console.log(err);
            	res.status(500).send("Internal Server Error");
        }
    	fs.readFile('data/'+id,'utf8', function(err, data){
    		if(err){
    			console.log(err);
            	res.status(500).send("Internal Server Error");
        	}
        }
        res.render('view',{topids:files, title:id, desc:data});
        })
    })
})


//.views_file/view.jade  수정

doctype html
html 
    body
    	ul
        	each topic in topics
            	li 
                	a(href="/topic/"+topic)=topic     	//=은 변수라는 뜻
                    
         article 
         	h2 = title
            	= desc
더보기
단순 데이터를 가져오기 = get방식

 

 

 

 

 

3. 코드 개선

//app.js
app.get(['/topic','/topic/:id'], funciont(req,res){
    fs.readdir('data', function(err, files){ //읽어올 폴더명, 읽어온 후 결과(err, 결과 list객체)가 들어간 callback함수
    	if(err){
    		console.log(err);
            	res.status(500).send("Internal Server Error");
        }
        const id = req.params.id;
        if(id){   //id가 존재할 때
    		fs.readFile('data/'+id,'utf8', function(err, data){
    			if(err){
    				console.log(err);
            		res.status(500).send("Internal Server Error");
        		}
                res.render('view',{topids:files, title:id, desc:data});
        	})
        }else {   //id가 없을 때
        	res.render('view',{topids:files, title:'welcome', desc:'hello js'});
        }
    })
});


//.views_file/view.jade  수정

doctype html
html 
    body
    	h1
        	a(href="/topic") Server side js
    	ul
        	each topic in topics
            	li 
                	a(href="/topic/"+topic)=topic     	//=은 변수라는 뜻
                    
         article 
         	h2 = title
            	= desc
         div
         	a(href="/topic/new") new

readdir 부분 중복개선 

id값의 유무에 따라 view template 렌더링에 주는 데이터를 다르게 한다. 

 

 

 

 

redirect

//app.js
const fs = require('fs');
app.set('views'. './views_file');
app.set('view engine', 'jade');
app.post('/topic', function(req,res){
    const title = req.body.title;
    const desc = req.body.desc;
    fs. writeFile('data/'+title, desc, function(err){
    	if(err){
        	console.log(err);
    		res.status(500).send('Internal Server Error');  	// status(500) : 오류 
    	}
    	res.redirect('/topic/'+title);
    });
    }
})
더보기

res.redirect('/topic/'+title);