oris9

간단한 Express 실습 본문

Node.js

간단한 Express 실습

oris9 2024. 1. 21. 07:28

    데이터파일

    data.json

    더보기
    {
        "soccer": {
            "name": "Soccer",
            "subscribers": 800000,
            "description": "The football subreddit. News, results and discussion about the beautiful game.",
            "posts": [
                {
                    "title": "Marten de Roon to make pizza for more than 1,000 people in Bergamo if Atalanta win the Champions league.",
                    "author": "joeextreme"
                },
                {
                    "title": "Stephan Lichtsteiner has retired from professional football",
                    "author": "odd person"
                },
                {
                    "title": "OFFICIAL: Dani Parejo signs for Villareal.",
                    "author": "joeextreme"
                }
            ]
        },
        "chickens": {
            "name": "Chickens",
            "subscribers": 23956,
            "description": "A place to post your photos, video and questions about chickens!",
            "posts": [
                {
                    "title": "Naughty chicken hid under a shed for 3 weeks and came home with 25 chicks today!",
                    "author": "joeextreme",
                    "img": "https://preview.redd.it/pcn8u4j7c9z61.jpg?width=960&crop=smart&auto=webp&s=e114976dde1108b9556555d2db36a3cb6211798d"
                },
                {
                    "title": "Had to kill my first chicken today. Does it get any easier?",
                    "author": "sad boi"
                },
                {
                    "title": "My five year old chicken set and hatched one baby. I guess she wanted to be a mama one more time.",
                    "author": "tammythetiger",
                    "img": "https://preview.redd.it/lervkuis3me51.jpg?width=640&crop=smart&auto=webp&s=6a18ab3c4daa80eccf3449217589b922fa443946"
                }
            ]
        },
        "mightyharvest": {
            "name": "Mighty Harvest",
            "subscribers": 44002,
            "description": "Feeding many villages and village idiots for 10s of days.",
            "posts": [
                {
                    "title": "My first meyer lemon ripened today. Im so proud of the little guy. Banana for scale",
                    "author": "proudmamma",
                    "img": "https://preview.redd.it/1bz6we4j54941.jpg?width=640&crop=smart&auto=webp&s=a036ea99299f7737efde9f6c3bfa43893f5eaa00"
                },
                {
                    "title": "I think I overestimated the harvest basket size I needed.",
                    "author": "grower123",
                    "img": "https://preview.redd.it/4h99osd25i351.jpg?width=640&crop=smart&auto=webp&s=d651250a345bbceeba7a66632e8c52a02d71bc73"
                }
            ]
        }
    }

     

     

    index.js

    // express.static(root,[options])
    // app.use(express.static('public')); // 괄호안에 있는것; 미들웨어 - 요청이 들어오면 응답을 내보내는 식으로 작동함
    
    
    const express = require("express");
    const app = express();
    
    const path = require("path"); // (1) index.js가 있는 디렉토리안의 views디렉토리를 찾음
    
    const redditData = require("./data.json"); // data
    
    app.use(express.static(path.join(__dirname, "public"))); // css stylesheet 절대경로로 수정
    
    //익스프레스는 뷰나 템플릿이 views디렉토리 안에있다고 생각함
    //(디폴트, 바꿀수있음 - app.set('views')이용 - 홈페이지 참고)
    
    /**app.set(설정하려는 키/특성, 해당 값) */
    app.set("view engine", "ejs"); // 따로 불러오기 할 필요없이, app.set으로 불러옴
    app.set("views", path.join(__dirname, "/views")); // (2) index.js가 있는 디렉토리안의 views디렉토리를 찾음
    
    app.get("/", (req, res) => {
      res.render("home");
      /**res.render(view [,locals][,callback]) ; view를 렌더링하고 렌더링된 html문자열을 클라이언트에 보냄 */
    });
    
    app.get("/cats", (req, res) => {
      const cats = ["Rus", "cute", "love", "oris"];
      res.render("cats", { cats });
    });
    
    
    app.get("/r/:subreddit", (req, res) => {
      const { subreddit } = req.params;
      const data = redditData[subreddit]; // data
      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: num });
    });
    
    app.listen(3000, () => {
      console.log("Example app listening on port 3000!");
    });

    아래부터 views 디렉토리

    cats.ejs

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <h1>I LOVE CATS</h1>
        <ul>
          <% for(let cat of cats) {%>
          <li><%=cat%></li>
          <% } %>
        </ul>
      </body>
    </html>

    home.ejs

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Home</title>
      </head>
      <body>
        <h1>homepage</h1>
        <%= 3+2+3 %>
        <p>
          Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat
          laudantium praesentium tempore saepe ab cupiditate, libero, reprehenderit,
          vel cumque et corporis animi! Numquam, pariatur ab aspernatur quaerat
          eveniet corrupti cupiditate!
        </p>
    
        <p>
          Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat
          laudantium praesentium tempore saepe ab cupiditate, libero, reprehenderit,
          vel cumque et corporis animi! Numquam, pariatur ab aspernatur quaerat
          eveniet corrupti cupiditate!
        </p>
      </body>
    </html>

    random.ejs

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Random</title>
      </head>
      <body>
        <h1>Random : <%=num%></h1>
        <% if(num%2 ===0) { %>
        <h2>that is even number</h2>
        <% } else {%>
        <h2>that is odd number</h2>
        <% } %>
        <h3><%= num%2 === 0 ? 'EVEN' : 'ODD' %></h3>
      </body>
    </html>

    subreddit.ejs

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title><%= name %> </title>
        <link rel="stylesheet" href="/app.css">
    </head>
    
    <body>
        <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>
        <% } %>
    </body>
    
    </html>

    public 폴더안에 app.css 존재

    'Node.js' 카테고리의 다른 글

    [Node.js] 미들웨어에 대해 알아보기  (0) 2024.03.02
    [Node.js] Node.js 란?  (0) 2024.03.01
    Express 라우터, 쿠키, 세션 플래시  (0) 2024.02.20
    Mongoose express  (0) 2024.02.17
    [Node] npm  (0) 2024.02.04