All Articles

node js 2

웹애플리케이션 제작 / 복습 & database

생활코딩

내용정리

정리

var express = require('express');
var app = express();

app.listen(3000, function(){
	console.log('connected, 3000port!');
})

모듈을 가져올 때는 require

var express = require('express')

가져온 express를 제어, 사용하려면 함수 가 리턴 한 값을 express라는 변수에 담음

이 변수를 통해 express를 제어 할 수 있다.

var app = express();
app.listen(3000, function(){

})

함수를 호출 실행하면 app 객체를 리턴한다.

애플리케이션 객체가 갖고 있는 메소드 중에서 listen 이라는 것을 통해서 특정 포트를 리스닝 할 수 있게 한다.

3000번 포트를 바라보게 하고 싶다.

첫번째 인자로 3000, 두번쨰 인자로 function 콜백 함수

3000번 포트에 연결되면 콜백함수가 호출 되면서 연결 되었다는 상황을 알려준다.

라우팅

localhost:3000/topic/new 로 접속 했을때

app.get('/topic/new', function(req, res){
	res.send('hi');
})

템플릿 엔진 사용

디렉토리에 템플릿 파일을 넣겠다 는 것을 알려주려면

app.set

app.set('views', './views_file');
app.set('view engine', 'jade');

new.jade 파일생성 후

res.send 에서 render 로 변경해 렌더링

app.get('/topic/new', function(req, res){
	res.render('new');
})

new.jade

doctype html
html
	head
		meta(charset='utf-8')
	body
		form(action='/topic' method='post')
			p
				input(type='text' name='title' placeholder='title')
			p
				textarea(name='description')
			p
				input(type='submit')

코드 pretty 하게 보여주기

app.locals.pretty = true;

라우팅 / 애플리케이션이 받도록 라우터 설정

app.post('/topic', function(req, res){
	res.send('hi topic');
})

POST 방식을 위한 body parser 사용

npm install body-parser --save

bodyparser 모듈을 사용할 수 있게 로드

var bodyParser = require('body-parser');

use 코드 추가 / 상세 코드는 패턴화 해서 이해

app.use(bodyParser.urlencoded({ extended: true }));

확인

app.post('/topic', function(req, res){
	var title = req.body.title;
	var description = req.body.description;
	res.send('hi topic,'+req.body.title);
})

fs

filesystem module (파일시스템 모듈)

var fs = require('fs');

writeFile

data 파일 저장, 생성

app.post('/topic', function(req, res){
	var title = req.body.title;
	var description = req.body.description;
	fs.writeFile('data/'+title,description, function(err){
		if(err){
			res.status(500).send('internal server error');
		}
		res.send('success');
	});
})

파일명 : title

내용 : description

출력

get방식으로 url을 접속했을때 view.jade 파일을 보여줌

app.get('/topic', function(req, res){
	res.render('view');
});

readdir

data 디렉토리에 있는 파일목록을 가져와서 파일명 출력해서 리스트 생성하기

fs.readdir(path, callback)

첫번째는 경로, 두번째는 정보를 가져왔을 때 호출 될 콜백함수

app.get('/topic', function(req, res){
	fs.readdir('data', function(err, files){
		if(err){
			console.log(err);
			res.status(500).send('internal server error');
		}
		res.render('view', {topics:files});
	});
});

호출 되는 funtion 은 (err, files) 두개의 인자를 전달 받는다.

첫번째는 에러, 파일 목록을 갖고 있는 array를 전달 받는다.

에러가 있다면 console log 로 err를 출력 하고

files 안에는 data 라는 디렉토리 안에 포함되어 있는 각각의 파일들의 이름들이 배열로 담겨 있다.

files 라고 하는 배열에 담겨있는 이름을 이용해서 글 목록 완성

res.render 코드를 콜백 함수 안에 넣고

view라고 하는 템플릿 파일의 li에 파일들의 이름을 전달

어떻게?

render라는 함수는

첫번째 인자 : 템플릿파일의 이름이 들어가고,

두번째 인자 : 템플릿 파일 안으로 주입하고자 하는 데이터를 객체안에 담아서 주입하면 된다.

res.render('view', {topics:files});

jade iteration 반복문

view.jade

doctype html
html
	head
		meta(charset='utf-8')
	body
		h1 Server Side Javascript
	ul
		each topic in topics
			li= topic

링크 추가

doctype html
html
	head
		meta(charset='utf-8')
	body
		h1 Server Side Javascript
	ul
		each topic in topics
			li
				a(href='/topic/'+topic)= topic

id 값을 출력

app.get('/topic/:id', function(req, res){
	var id = req.params.id;
	res.send(id);
});

id값에 해당되는 파일을 읽어서 가져오기

fs.readFile

app.get('/topic/:id', function(req, res){
	var id = req.params.id;
	fs.readFile('data/'+id, 'utf8', function(err, data){
		if(err){
			console.log(err);
			res.status(500).send('internal server error');
		}
		res.send(data);
	});
});

정보를 list 밑에 출력

send 대신에 render로 바꾸고 view를 사용

app.get('/topic/:id', function(req, res){
	var id = req.params.id;
	fs.readFile('data/'+id, 'utf8', function(err, data){
		if(err){
			console.log(err);
			res.status(500).send('internal server error');
		}
		res.renter('view', {title:id});
	});
});

view.jade

doctype html
html
	head
		meta(charset='utf-8')
	body
		h1 Server Side Javascript
	ul
		each topic in topics
			li
				a(href='/topic/'+topic)= topic
	article
		h2= title

에러

목록 가져오는 것을 복붙 후 수정

app.get('/topic/:id', function(req, res){
	var id = req.params.id;

	fs.readdir('data', function(err, files){
		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', {topics:files, title:id});
		});
	});
});

본문 출력

= description

doctype html
html
	head
		meta(charset='utf-8')
	body
		h1 Server Side Javascript
	ul
		each topic in topics
			li
				a(href='/topic/'+topic)= topic
	article
		h2= title
		= description

코드의 개선

중복제거

route 배열에 복수로 주고 싶은 path를 준다

app.get(['/topic','/topic/:id'], function(req, res){
	fs.readdir('data', function(err, files){
		if(err){
			console.log(err);
			res.status(500).send('internal server error');
	}
	var 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', {topics:files, title:id, description:data});
		});
	} else {
		// id값이 없을 때
		res.render('view', {topics:files, title:'welcome', description:'hello javascript for server'});
	}
	});
});

제목에 홈 링크 추가

view.jade

h1
	a(href='/topic') Server Side Javascript

글쓰기 버튼 추가

div
	a(href='/topic/new') new

글 작성 페이지에도 레이아웃 추가

app.get('/topic/new', function(req, res){
	fs.readdir('data', function(err, files){
		if(err){
			console.log(err);
			res.status(500).send('internal server error');
		}
		res.render('new', {topics:files});
	});
});

redirect

작성후 리스트로 보내기

app.post('/topic', function(req, res){
	var title = req.body.title;
	var description = req.body.description;
	fs.writeFile('data/'+title,description, function(err){
		if(err){
			res.status(500).send('internal server error');
		}
		res.redirect('/topic/'+title);
	});
});