라우트 

 

비슷한 기능을 하는 app.get() 함수 2개를 중복만 제거하고 하나로 합쳐보자. 

 

 

여러 경로를 한번에 처리 

 

get() 함수에서 파일명, 파일 내용을 가져오는 코드의 중복을 제거. 

 

새 글 쓰는 버튼을 누르면, 글목록 하위에 form 이 나오도록 jade 템플릿 변경

 

새 글을 쓰고 나서, 글을 제대로 썼는지 작성된 글 페이지로 '리다이렉션' 하여 이동.

res.redirect( 경로 ) 함수를 이용 

 

작성 후에 바로 작성내용을 볼 수 있다. 


app_file.js 

// 파일로 만든 웹앱 (03-15)

var express = require('express');
var app = express();
var bodyParser = require('body-parser')
var fs = require('fs')

// POST 방식 처리할 때, body 속성을 가공해준다 
app.use(bodyParser.urlencoded({extended: false}))

//템플릿 엔진 (views 들을 위치할 디렉토리 적어준다)
app.set('views', './views_file');
//템플릿 엔진 종류 명시 
app.set('view engine', 'jade');

app.locals.pretty = true;

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


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

        // id 값이 있는지 없는지! 
        if(id){
            fs.readFile('data/'+id, 'utf8', function(err, data){
                // 파일 내용을 가져옵니다. 
                if(err){
                    console.log(err);
                    res.status(500).send('Internal Server Error')
                }
                // render 인자 : 템플릿파일명, 주입하려는 객체 
                // 파일목록, 제목, 내용
                res.render('view', {topics:files, title: id, description:data});
            })
        }else{ // id 값이 없으면, 
            res.render('view', {topics:files, title:'Welcome', description:'hello'})
        }
    })


})


// POST 처리
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){
            console.log(err)
            res.status(500).send('Internal Server Error')
        }// 콜백함수 실행완료 후에 응답 가능하므로, res.send 가 여기에 위치.
        res.send('Success!')
    });
})

// 애플리케이션이 특정 포트를 listen() 하도록.
app.listen(3000, function(){
    console.log('Connected 3000 port ! ');
}) 

 

view.jade

홈버튼과 새글쓰기 버튼을 추가함 

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

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

 

new.jade 

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

        article
            form(action='/topic', method='post')
                p
                    input(type='text' name='title' placeholder='title')
                p
                    textarea(name='description')
                p
                    input(type='submit')

                

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

MySQL 사용  (0) 2020.03.18
MySQL 설치  (0) 2020.03.16
본문 읽기 - 전체 코드 포함  (0) 2020.03.16
글 목록 만들기  (0) 2020.03.16
POST방식 GET방식  (0) 2020.03.15

아래 포스팅 '글 목록 만들기' 글과 이어지는 포스팅 입니다. 

 


1. GET 방식에 따라 URL 이 변경되는데 파일명을 받아옵니다. 

 

2. 글 목록을 보여줍니다. 

fs.readdir() 함수로 files 목록을 받아오고, 

jade 템플릿 view.jade 로 topics 이름의 files 목록을 주입합니다. 

 

3. http://127.0.0.1:3000/topic 로 접속하면 파일명 링크만 나옵니다.

 

파일명 링크를 누르면, URL이 http://127.0.0.1:3000/topic/javascript 로 변경되고, 파일 내용도 출력됩니다. 

 

파일명과 내용을 보여주는 view.jade 템플릿을 만듭니다.  

( article 부분만 추가했습니다) 

title, description 이름으로 넘어오는 변수값을 출력합니다. 

 

 

4.

 

2개의 기능이 동시에 필요합니다. 

파일명을 가져오고 파일 이름을 가져오는 함수 

render() 함수의 파라미터로 넘길 객체의 이름과 값을 {} 로 감싸고 콤마로 구분합니다. 

 

 


전체코드 

 

app_file.js

// 파일로 만든 웹앱 (03-15)

var express = require('express');
var app = express();
var bodyParser = require('body-parser')
var fs = require('fs')

// POST 방식 처리할 때, body 속성을 가공해준다 
app.use(bodyParser.urlencoded({extended: false}))

//템플릿 엔진 (views 들을 위치할 디렉토리 적어준다)
app.set('views', './views_file');
//템플릿 엔진 종류 명시 
app.set('view engine', 'jade');

app.locals.pretty = true;

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

// 본문 읽기 
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')
            }
            // render 인자 : 템플릿파일명, 주입하려는 객체 
            // 파일목록, 제목, 내용
            res.render('view', {topics:files, title: id, description:data});
        })
    })
    
})


// 글 목록 보이기 
app.get('/topic', function(req,res){
    fs.readdir('data', function(err,files){
        if(err){
            console.log(err);
            res.status(500).send('Internal Server Error')
        }
        // render 인자 : 템플릿파일명, 주입하려는 객체 
        res.render('view', {topics:files})
    })
})

// POST 처리
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){
            console.log(err)
            res.status(500).send('Internal Server Error')
        }// 콜백함수 실행완료 후에 응답 가능하므로, res.send 가 여기에 위치.
        res.send('Success!')
    });
})

// 애플리케이션이 특정 포트를 listen() 하도록.
app.listen(3000, function(){
    console.log('Connected 3000 port ! ');
}) 

 

템플릿 코드  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
            =description

            

 

새 파일 만드는 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')

                

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

MySQL 설치  (0) 2020.03.16
코드 개선  (0) 2020.03.16
글 목록 만들기  (0) 2020.03.16
POST방식 GET방식  (0) 2020.03.15
쿼리스트링과 시맨틱URL  (0) 2020.03.15

파일을 이용하여 글 목록을 만들어보자. 

(나중에는 DB를 이용한다.)

 

form 화면에서 사용자의 입력을 받아서 파일을 만듭니다. 

파일의 이름과 파일의 내용으로 글의 목록이 만들어집니다. 

링크를 클릭하면 글의 내용이 바뀝니다. 


필요한 모듈 

 

express, body-parser, fs (파일시스템) 모듈

 

 

필요한 파일과 디렉토리 

 

app_file.js : entry point 파일

views_file 디렉토리 : jade 템플릿 파일 저장 

data 디렉토리 : 글목록을 만들기 위한 파일을 저장

 

 

 

1. 필요한 모듈을 require()로 가져옵니다. 

 

2. 포트 설정하여 서버 listen()

entry point 파일인 app_file 에서, 애플리케이션이 3000 번 port 를 listen 하도록 만듭니다. 

 

3. /topic 경로로 들어오면, 화면에 문자열을 출력해봅니다. 

URL로 접근하는 것이니까 app.get() 함수를 사용합니다. 

 

4. jade 템플릿 사용 설정을 합니다. 

--> set() 함수 사용 

jade 템플릿 파일들이 위치할 디렉토리를 지정합니다. 

jade 라는 'view engine' 을 사용할 것이라고 지정합니다. 

 

5. /topic/form 경로에서 form.jade 템플릿을 쓰도록 render() 함수를 써줍니다. 

 

6. form 이 있는 form.jade 템플릿 파일을 만듭니다. 

제목과 내용.

두 칸을 만들어서 입력을 받습니다. 

'제출' 버튼을 누르면, action= '/topic' 이므로, topic 경로로 전송합니다. 방식은 POST.

 

7.  템플릿 엔진의 html 태그를 예쁘게 정렬하기 위한 코드를 추가합니다.

 

8.  POST 방식으로 만든 form 의 body 객체 데이터에 접근해야 title과 description 값을 가져올 수 있습니다. 

 

파일을 생성하는 모듈이 필요합니다.

파일 시스템에 대한 Node.js Document를 읽어봅니다. 

 

파라미터를 봅니다. 

파일명, 데이터, 그리고 옵션, 콜백함수 순으로 받습니다. 

 

콜백함수의 파라미터가 err 라고 되어있는데, 혹시 에러가 발생하면 err 변수에 내용을 알려준다는 뜻입니다. 

 

app_file.js 에 app.post() 함수를 추가합니다. 라우팅은 /topic 으로 합니다. 

 

title이 파일명이 되고, description은 파일의 내용이 됩니다. 

 

파일은 data 라는 디렉토리 하위에 만들꺼니까, 경로를 'data/' + title 로 해줍니다. 

디렉토리명 뒤에 / 슬래시를 붙여줘야 합니다. 

 

 

 POST 방식으로 body 태그 내용을 처리하기 위해 bodyParser 사용 설정을 합니다.

글 제목과 내용을 입력받을 html의 body 태그내용에 접근해야 합니다. 

form 에 내용을 쓰고 제출 버튼을 눌러보면, data 디렉토리 하위에 title과 똑같은 파일명이 생긴것을 확인할 수 있습니다. 

 

 

 

9. 이제 data 하위의 파일명으로 글목록을 만듭니다. 

파일을 쓰는게 아니라 디렉토리 내의 파일을 읽을 것이기 때문에 fs.readdir() 함수를 이용합니다. 

 

app.get() 함수에 /topic으로 라우팅 하고, 콜백함수 내에 readdir() 함수를 작성합니다. 

readdir() 함수의 콜백함수는 err 가 있다면 err를 알려주고,  files 이름으로 파일명들을 리턴합니다. 

err가 있다면 console.log() 로 출력하고, 응답으로 500 코드와 메시지를 출력하도록 합니다. 

 

콜백함수가 끝나기 전 마지막에 render() 를 작성합니다. 

render() 함수의 첫째 파라미터는 jade 템플릿명을 쓰고, 둘째 부터는 돌려주고 싶은 객체값 files를 topics 라는 이름으로 씁니다.

 

10. 파일목록 jade 템플릿은 이런 모양입니다. 이것을 jade iterator로 수정합니다. 

 

 

jade에서 객체를 반복하는 것은 iterator 입니다. jade document를 참조합니다. 

 

 

 

 

11. 폼에 내용 입력해서 파일 생성하고, 파일목록 읽어서 글목록 조회해보기! 

 

http://127.0.0.1:3000/topic/form 에서 제목과 내용을 입력합니다. 

 

http://127.0.0.1:3000/topic 에서 보이는 글목록 화면 입니다. 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

코드 개선  (0) 2020.03.16
본문 읽기 - 전체 코드 포함  (0) 2020.03.16
POST방식 GET방식  (0) 2020.03.15
쿼리스트링과 시맨틱URL  (0) 2020.03.15
query string  (0) 2020.03.15

URL 에서 정보를 받아오는 것은 GET방식 이다. 경로 뒤에 '?'를 붙이고 쿼리스트링을 쓰는 것이 일반적이다. 

 

사용자의 정보를 '서버로 전송'할 때는 POST 방식이 필요하다.  

 

 

[ GET 방식 ]

예를 들어 비밀번호 같은게 URL에 드러나게 넘어가면 안된다.

쿼리 스트링에 따라 데이터가 달라지는 것을 눈으로 확인할 수 있다. 

데이터 길이가 길면 URL에서 내용이 짤린다. 

만약, textarea의 내용이 수천줄이라면 URL에 전체 데이터가 담기지 않는다. 

 

[ POST 방식 ]

URL에 데이터가 포함되지 않는다. 불필요하게 정보가 노출되지 않는다. 

용량이 큰 데이터라도 괜찮다. 

express 가 기본적으로 제공하지 않으므로,

body-parser 모듈을 붙여서 사용자 요청을 가공하여 쓰도록 한다. 

 

 

둘 다 보안이 취약하다. 보안을 신경쓴다면 다른 차원의 노력이 필요하다. SSL인증, HTTPS 프로토콜이 필요하다. 

 


jade template 으로 Form(폼)을 만들어보자. 

 

html 태그에 속성을 넣으려면 소괄호를 열어서 써준다. 

 

 

html 태그의 내용을 서버에 알려주려면 name 속성에 이름을 써줘야한다. 

title 이라는 이름으로 input칸의 내용을 받는다. 

description 이라는 이름으로 textarea 의 내용을 받는다. 

 

다음과 같은 html 코드가 생성된다. 

폼에 내용을 입력한 화면 

http://127.0.0.1:3000/form_receiver?title=hello&description=world

'제출' 버튼을 누르면 위와 같은 URL이 보인다. 

/from_receiver 로 경로가 변경되고, '?'부터 쿼리 스트링이 돌아온다. 

 

app.js 에 폼이 전송될 /form_receiver 라우터를 만들어준다. 

라우터를 지정해주고, 서버를 재시작하고, '제출' 버튼을 누르면 

http://127.0.0.1:3000/form_receiver?title=hello&description=world

hello와 world 를 쿼리를 통해 가져온다. 

 

form 태그의 method 속성. 'get' 방식이 기본이다.  

 

method='post'로 바꿔보자. 

 

post 방식이라면, URL을 통해 데이터를 전송하지 않는다. 

 

post방식으로 해두고, 제출 버튼을 눌러도 

 

http://127.0.0.1:3000/form_receiver

 

이처럼 쿼리스트링이 붙지 않고, URL 변경도 없다. 

 


GET 방식

req 의 query 객체에서 파라미터명으로 접근할 수 있다. 

 

POST 방식

req 의 body 객체에서 파라미터명으로 접근할 수 있다. 

 

이 때, 주의할 점은 html form 태그의 method 속성을 get 또는 post로 명시해줘야 한다!

 

그리고,

 

POST방식에서 데이터를 넘길 때, body 객체에서 속성을 가지고 올 수 있도록,

body-parser 모듈이 필요하다.

 

 

Express 홈페이지의 자세한설명을 보자. 

첫째줄을 읽어보면. body 객체는 기본적으로 undefined 인데, body-parsing 미들웨어를 쓰면된다고 써있다.

express.json() 또는 express.urlencoded() 

 

 

body-parser 라는 모듈을 설치하자 

 

그리고 body-parser를 require() 함수로 가져온다. 

app.use() 로 모듈을 우리 애플리케이션에 붙인다. 

이제, bodyParser 가 html 의 body 부분 객체를 인식할 수 있도록 한다! 

 

정리하면, bodyParser 가  use() 라는 함수로 연결한다. 

 


bodyParser는 사용자가 POST 방식으로 전송한 데이터를 request 객체 내의 body 객체를 추가하고, 

 

body 객체에 title 이라는 속성을 만들고 값을 넣어서 사용자에게 제공해주는 것이다. 

 

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

본문 읽기 - 전체 코드 포함  (0) 2020.03.16
글 목록 만들기  (0) 2020.03.16
쿼리스트링과 시맨틱URL  (0) 2020.03.15
query string  (0) 2020.03.15
jade template engine  (0) 2020.03.15

쿼리 스트링에 입력된 값에 따라 다른 내용이 출력되게 해보자. 

 

topics 라는 배열이 있다. 

인덱스 0에 JS 문자열, 인덱스 1에 Nodejs 문자열, 인덱스 2에 Express 문자열이 있다. 

 

id 의 값이 0, 1,  2 인 것에 따라서 페이지에 출력되는 문자열이 달라진다. 

 

URL이  http://127.0.0.1:3000/topic?id=2 이라면, 

인덱스 2에 해당하는 Express is 문자열이 출력된다. 

 

 

 

링크를 만들어보자. 

 

html 링크 3개를 만들어서 res.send() 에 넘기자. 

URL에서 받은 id 에 해당하는 문자는 js표현식으로 같이 넣는다.

${} 를 이용하면, 변수명을 그대로 코드에 넣을 수 있다. 

html 코드를 쓸 때는 작은 따옴표가 아닌, 그레이브 액센트 (ESC 키 위에 있는 ` ) 로 감싼다. 

 

html 코드는 output 이라는 변수로 만들고, res.send() 함수의 파라미터로 넘긴다. 

 

링크를 누를 때 마다 아래에 출력되는 문자열이 달라진다. 


시맨틱 URL 을 써보자. (semantic url) 

 

쿼리스트링 없이 URL만 가지고 정보를 전달해보자. 

 

예를 들어, 

http://127.0.0.1:3000/topic?id=2 이렇게 물음표와 = 이퀄 문자없이 

http://127.0.0.1:3000/topic/2 이렇게 '/'슬래시만 가지고 사용자 요청을 전달하는 것이다. 

 

위키에 semantic url 을 검색해보면 다음과 같은 예시가 나온다. 

 

깔끔!

URL 에서 /topic 뒤에 오는 것을 변수로 받고 싶다면,

 

app.get() 내부의 라우터에, 경로에 콜론과 변수명을 써준다. 

 

http://127.0.0.1:3000/topic/1

이 주소로 접근하면, 에러가 안난다!

 

id 자리에 입력한 숫자 1을 받아오려면 

${topics[req.query.id]} 가 아니라, params 라는 키워드로 바꿔준다. 

${topics[req.params.id]}

즉, id로 1을 받아올 수 있다는 것이다. 

 

2로 접근하면 Express 문자열이 나오고 

0으로 접근하면 JavaScript

라우팅에서 선언한 파라미터 명과, params.파라미터명을 정확히 맞춰주는 것이 중요하다. 

 

여러개의 파라미터를 넘겨보자. 

http://127.0.0.1:3000/topic/1/edit  

id는 1로, mode는 edit라는 정보의 파라미터를 넘긴다. 

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

글 목록 만들기  (0) 2020.03.16
POST방식 GET방식  (0) 2020.03.15
query string  (0) 2020.03.15
jade template engine  (0) 2020.03.15
Express app.use()  (0) 2020.03.14

URL 내부에서 물음표 ('?') 뒤에 나오는 부분을 쿼리 스트링 이라고 한다. 

 

쿼리 스트링은 사용자에게서 받은 변수를 서버에 넘기기 위해 필요하다. 

 

http://abc.com 이라는 URL이 있다. 

 

http는 프로토콜이다.

 

abc.com은 도메인(호스트)이다. 서버 컴퓨터의 주소다.

 

http://abc.com/topic?id=1 

http://abc.com/topic?id=2

http://abc.com/topic?id=3 

 

/topic은 경로이다. path이다. 일종의 라우팅을 하는 것이다. 

 

'?' 물음표 다음부터는 쿼리 스트링이다. 

 

id값을 1 또는 2 또는 3으로 넘기고 있는 URL 예시이다. 

 

 


같은 패스 안에서도, 쿼리스트링에 따라 다른 결과가 출력되는 애플리케이션을 만들어보자! 

 

 

URL에 들어오는 값은 사용자의'요청' 에 해당한다. request 에 해당한다. 

app.js 에  다음의 코드를 추가해보자. 

 

/topic 경로로 들어왔을때, URL 이 http://127.0.0.1:3000/topic?id=3 이라면 

쿼리 안의 id 라는 변수 값을 

req.query.id 로 접근할 수 있다. 

 

이 때, 화면에 출력되는 결과는 3이다. id 의 값이 출력된 것이다. 

3이 출력된 화면

 

2개의 값을 넘기고 싶다면? 

 

예를 들어, id와 name 이렇게 2개의 변수를 넘기고 싶다면. 변수 사이에 & 으로 구분 해준다. 

http://127.0.0.1:3000/topic?id=3&name=brocoli

 

app.js 코드에서, res.send() 함수 내부에변수간에 콤마(,) 로 연결해주면 된다. 

그러면 URL의 여러개의 값에 접근할 수 있다. 

 

 

응용을 위해 Express 문서를 보자. 

 

express가 다루는 객체, 함수에 대해 그때 그때 찾아보고 활용해야 한다. 문서와 친해지자!

 

request 에서, query라는 객체를 찾아보면 위와 같은 예시가 있다. 

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

POST방식 GET방식  (0) 2020.03.15
쿼리스트링과 시맨틱URL  (0) 2020.03.15
jade template engine  (0) 2020.03.15
Express app.use()  (0) 2020.03.14
Express  (0) 2020.03.13

jade 템플릿을 사용법을 정리해본다. 

 

 

jade를 설치하고 jade를 express에 사용할 템플릿 엔진으로 설정한다. 

 

app.set() 함수를  이용한다. (코드 11번 라인)

 

관습적으로 jade 템플릿 코드는 views 이름의 디렉토리에 저장한다. 

 

템플릿 코드 파일명을 temp.jade로 하고 views 디렉토리 하위에 만든다. 

 

/template 경로로 들어오면 아까 만든 'temp.jade' 템플릿을 기반으로 내용을 화면에 뿌려준다.

 

이를 랜더링한다고 하여 res.render() 함수를 이용하여 템플릿 코드명을 안에 써준다. 

 

추가로 넘겨줄 객체가 있다면, 파일명 다음에 써준다. 

 

time 이라는 이름으로 'hello'라는 문자열이 넘어가는 코드다. 

 


 

jade 에서 html 태그를 사용할때 개행과 들여쓰기가 중요하다. 

 

 

html 태그를 여러개 쓸 때, '줄바꿈'을 하면 새 태그로 인지한다. 

 

그리고 들여쓰기를 해서 태그의 열고 닫음을 구분한다. 

 

자바스크립트 코드를 넣고 싶으면 - 마이너스를 하나 넣고 코드를 삽입한다 

 

개행을 해야 html 태그가 각각 적용된다!
페이지 소스 보기 결과

 

jade 템플릿 코드에서 html  태그 끼리 줄바꿈을 안한다면 ?

이처럼 html head body 태그가 제대로 적용이 안된다. 

 


 

템플릿에 객체를 주입하고 싶다면? 

 

Date() 객체를 time이라는 이름으로 넘기고, 'Jade title' 문자열을 _title 이름으로 넘기고 싶다면.

 

app.js 의 app.get() 함수 내부의 코드를 수정한다. 

 

res.render() 안에 {} 로 감싸서 여러개의 객체를 넘길 수 있다. 

 

jade 템플릿에서는

title 태그 옆에 _title 이라는 변수 명을 써주고, 

div 태그 옆에 time 이라는 변수 명을 써준다. 

이 때, 주의할 점은 태그 다음에 '=' 를 꼭 써줘야 한다! 

 

title태그 = _title변수명

div태그 = time변수명

 

문자열과 시간 정보가 제대로 넘어왔다! 

 

더 알고 싶다면! Jade template engine 홈페이지를 참조하자. 

 

튜토리얼 티쳐에 Jade 튜토리얼 페이지도 있다. 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

쿼리스트링과 시맨틱URL  (0) 2020.03.15
query string  (0) 2020.03.15
Express app.use()  (0) 2020.03.14
Express  (0) 2020.03.13
Node.js  (0) 2020.03.13

+ Recent posts