ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [이력서 꾸미기] EJS(Embedded JavaScript Templating)
    개발/프로젝트2(유데미) 2023. 3. 13. 21:13

     

    일단 오늘 배운 풀코드

    const express = require('express');
    const app = express();
    const path = require('path');
    const redditData = require('./data.json');
    
    app.use(express.static(path.join(__dirname, 'public')))
    
    app.set('view engine', 'ejs');
    app.set('views', path.join(__dirname, '/views'));
    
    app.get('/', (req, res) => {
        res.render('home');
    })
    
    app.get('/cats', (req, res) => {
        const cats = [
            'Blue', 'Rocket', 'Monty', 'Stephanie', 'Winston'
        ]
        res.render('cats', { cats })
    })
    
    app.get('/r/:subreddit', (req, res) => {
        const { subreddit } = req.params;
        const data = redditData[subreddit];
        if (data) {
            res.render('subreddit', { ...data });
        } else {
            res.render('notfound', { subreddit });
        }
    
    })
    
    app.get('/rand', (req, res) => {
        const num = Math.floor(Math.random() * 10) + 1;
        res.render('random', { num });
    })
    
    app.listen(3000, () => {
        console.log("LISTENING ON PORT 3000");
    });

     

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

    이부분은 그냥 처음 시작할때 같이 작성해야한다

    노드에서 프레임워크 Express를 가져오고 express는 대부분 app으로 만든다고 한다

    깃배쉬에서 npm i express 설치하고 index.js 만들고 이부분이랑

    맨 마지막에 써있는

    app.listen(3000, () => {
        console.log("LISTENING ON PORT 3000");
    });

    이 부분 먼저 작성한다

    깃배쉬에서 서버 실행하고 localhost:3000으로 들어가면 화면을 볼수있게 설정하는 것이다

    그리고 시작되면 아무것도 안써있으니까 실행중인걸 콘솔에서 알 수 있게 메세지를 출력한다고 한다

     

    그리고 노드몬도 설치했다

    노드몬을 설치하지 않으면 파일을 수정할때마다 서버를 계속 껐다 켰다 해야돼서 귀찮은데

    노드몬을 설치하면 그냥 한번 실행하면 알아서 새로고침할때마다 자동으로 껐켰해줘서

    신경 안쓰고 하면 된다

     

    근데 노드몬을 종료했다가 다시 켜야할때 자꾸 에러가 발생했다

    나만 그런게 아니고 노드몬 문제인건지 윈도우 문제인건지 아무튼 내가 문제는 아닌거 같긴 한데

    나중에 더 찾아봐야겠음

     

    const path = require('path');

    이 부분은 노드 자체에 있는 경로를 가져온다고 한다

     

    const redditData = require('./data.json');

    이 부분은 data.json 파일에 있는 데이터를 가져오는 것인데 

    json 파일에는 그냥 soccer, chickens, mightyharvest 이름, 회원수 같은 데이터가 들어있다

     

    app.use(express.static(path.join(__dirname, 'public')))

    __dirname은 절대경로를 설정한다고 한다

    이걸 설정안하고 한단계 위에서 index.js에 접근했을때 에러가 났다

    이 부분을 작성하고 나면 한단계 디렉토리 위에서도 절대경로여서 에러가 나지 않는다

     

    app.set('view engine', 'ejs');
    app.set('views', path.join(__dirname, '/views'));

    뷰 엔진을 ejs로 설정하고 디렉토리를 views폴더로 설정한다 

    여기도 마찬가지로 절대경로로 설정한다

     

    app.get('/', (req, res) => {
        res.render('home');
    })

    루트 url경로를 설정하는 부분이다

     

    app.get('/cats', (req, res) => {
        const cats = [
            'Blue', 'Rocket', 'Monty', 'Stephanie', 'Winston'
        ]
        res.render('cats', { cats })
    })

    /cats 경로에 대한 라우트를 설정하고 /cats를 렌더링한다

    cats 이름을 적어놓은 배열을 하나하나 cats로 전달했다

    cats.ejs 파일에서 for문을 사용하여 작성해서 하나하나 cats로 불러왔는데

    for문을 사용할때 ejs(embedded javascript templating)를 사용하여

    <%= %>로 한줄 한줄 감싸서 자바스크립트를 사용할 수 있었다

     

    app.get('/r/:subreddit', (req, res) => {
        const { subreddit } = req.params;
        const data = redditData[subreddit];
        if (data) {
            res.render('subreddit', { ...data });
        } else {
            res.render('notfound', { subreddit });
        }
    
    })

    /r/:subreddit 경로에 대한 라우트를 설정하고 subreddit을 사용하여 아까 불러왔던 redditData에서 데이터를 검색한다

    이때 경로를 subreddit 데이터에 존재하는 이름으로 검색하면 해당 데이터를 렌더링하고

    없는경우는 notfound.ejs 파일을 따로 만들어서 렌더링한다

     

    app.get('/rand', (req, res) => {
        const num = Math.floor(Math.random() * 10) + 1;
        res.render('random', { num });
    })

    이부분도 사실 테스트용으로 그냥 만든 페이지같긴 한데

    /rand 에 대한 라우트를 설정하고

    1에서 10 사이의 난수를 생성해서 random으로 전달한다

     

     

    그렇게 만든 subreddit.ejs

    <%- include('partials/head') %>
    
        <body>
            <%- include('partials/navbar') %>
                <div class="container">
                    <h1>Browsing The <%= name %> subreddit</h1>
                    <h2>
                        <%= description %>
                    </h2>
                    <p>
                        <%= subscribers %> Total Subscribers
                    </p>
                    <hr>
    
                    <% for(let post of posts){ %>
                        <article>
                            <p>
                                <%= post.title %> - <b>
                                        <%= post.author %>
                                    </b>
                            </p>
                            <% if(post.img){ %>
                                <img src="<%= post.img %>" alt="">
                                <% } %>
                        </article>
                        <% } %>
                </div>
        </body>
    
        </html>

    nav 부분을 따로 지정하지 않게 하기위해 head 부분을 따로 만들어서 

    head.ejs 파일로 저장하고 footer부분도 따로 저장해도 된다고 한다

    부트스트랩을 이용하여 조금 보기좋게 만들었다

     

     

     

    댓글

Designed by Tistory.