Express helps us...
1) 요청을 받아들일 서버 구축을 돕고 들어오는 요청을 파싱한다. (HTTP 요청이 텍스트 정보이므로)
-> JS 객체가 아니므로 express가 돕는다.
-> 정보를 요청으로 변환하고 요쳥을 객체로 변환
-> 요청이 일치되도록 도와주기 때문에 /home을 요청할 때만실행되는 코드를 작성할 수 있고 /about 이나
/contact, /log out 같이 어떤 요청인지에 따라 실행되는 다양한 코드와 함수를 작성할 수 있음.
2) 응답을 만드는 것도 도와주는데 상태코드를 설정할 수 있고 헤더와 같은 콘텐츠를 어떻게 응답할지 설정 가능
Library vs Framework
Library
-> When you use a library, you are in charge! You control the flow of the application code , and you decide when to use the library.
Framework
-> with frameworks, that control is inverted. The framework is in charge, and you are merely a paricipant ! The framework tells you where to plug in the code.
공통점
차이점
그러나,, (프레임워크는)
프레임워크의 야망이 훨씬 큼...
//express 불러오기
const express = require('express');
//express 실행하기
const app = express();
//(요청이 들어오면 콜백 실행 - use)
app.use(() => {
console.log("we got a new request")
})
//서버설정 (3000: 출입문)
app.listen(3000, () => {
console.log("listening on port 3000 ")
})
req (들어오는 요청을 의미) , res(응답을 의미)
res.sed
app.get
app.get('/cats', (req,res) => {
res.send("MEOW!")
})
app.get('/dogs', (req,res) => {
res.send('Bark!')
})
//브라우저 홈 요청
app.get('/', (req,res) => {
res.send("This is a home")
})
app.post('/cats', (req,res) => {
res.send('POST REQUEST TO /cats !!!')
})
app.get('/cats', (req,res) => {
res.send("MEOW!")
})
app.get('/dogs', (req,res) => {
res.send('Bark!')
})
//(요청이 들어오면 콜백 실행 - use)
//app.use((req,res) => {
// console.log("we got a new request")
// res.send("HEEELOOOO")
//})
//Generic Respnse -> app.get 메소드 중 가장 밑에와야함 아니면 해당 메소드만 실행하고 다른 get메소드는 무시됨.
// 응답은 한가지만 가능 (두가지 X)
app.get('*', (req,res)=> {
res.send("I dont know that path!")
})
//매개변수 설정
app.get('/r/:subreddit',(req,res) => {
const {subreddit} = req.params;
res.send(`<h1>Browsing the ${subreddit} subreddit <h1>`)
})
//다중 매개변수 설정
app.get('/r/:subreddit/:postID',(req,res) => {
const {subreddit , postID} = req.params;
res.send(`<h1>Viewing post ID: ${postID} on the ${subreddit} subreddit <h1>`)
})
app.get('/search', (req,res) => {
console.log(req.query);
res.send("Hi!");
})
app.get('/search', (req,res) => {
const { q } = req.query;
if(!q) {
res.send("nothing searched")
}
res.send(`<h1> Search results for: ${q}<h1>`);
})
코드 변경 후에도 서버를 직접 재시작하지 않고 '자동'으로 재시작 하는 방법
설치명령어 : nodemon -g install
Templating
Templating allows us to define a preset "pattern" for a webpage, that we can dynamically modify wi
매번 정적인 HTML 코드를 쓰는 대신에 정보와 로직을 넣어서 루프로 여러번에 걸쳐 템플릿의 일부를 반복할 수 있음.
최종 목표는 특정로직과 HTML 응답 생성을 결합하는 것.
EJS
//ejs 사용한다고 express에게 알리기
app.set('view engine', 'ejs');
ejs 설치
res.render
//ejs 사용한다고 express에게 알리기
app.set('view engine', 'ejs');
//views가 default 파일이라 경로따로 설정 X
// hoeme.ejs 할 필요 없음 app.set 에서 ejs 사전언급.
app.get('/', (req,res) => {
res.render('home')
})
const path = require('path');
app.set('views', path.join(__dirname, '/views'))
Node에 내장된 path라는 모듈은 파일과 디렉토리 경로에 관한 메서드를 제공해 준다. 그리고 path.join은 다양한 경로를 합쳐 일반화해 결국 '하나'의 경로를 만들어낸다.
<%= contents %>_
app.get('/rand', (req,res) => {
const num = Math.floor(Math.random() * 10) +1
res.render('random', {rand : num})
})
app.get('/r/:subreddit', (req,res) =>{
//html에서 변수로 사용하기 위해 subreddit 변수 생성 (req.params)
const {subreddit} = req.params;
res.render('subreddit', {subreddit});
//작은따옴표 subreddit은 템플릿명, 뒤에 subreddit은 들어가는 변수명
})
const redditData = require('./data.json')
app.get('/r/:subreddit', (req,res) =>{
//html에서 변수로 사용하기 위해 subreddit 변수 생성 (req.params)
const {subreddit} = req.params;
const data = redditData[subreddit]; //data.json에서 데이터 가져오기
if(data) {
res.render('subreddit', {...data}); //데이터를 객체로 옮기는 대신 아싸리 객체 안에 펼쳐버리기
//작은따옴표 subreddit은 템플릿명, 뒤에 subreddit은 들어가는 변수명
} else {
res.render("notfound", {subreddit}) // " "안에 들어간건 템플릿(ejs 확장자 파일)
}
})
<link rel="stylesheet" href="/css/bootstrap.min.css" />
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap.min.js"></script>
<%- include 'foldername/filename' %>
<->
<%= contents %> : HTML에 escaped 시키는 tag (즉 , HTML로 취급하지 않음.)