npm์๋ ์๋ฒ๋ฅผ ์ ์ํ๋ ๊ณผ์ ์์์ ๋ถํธํจ์ ํด์ํ๊ณ ํธ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์น ์๋ฒ ํ๋ ์์ํฌ๊ฐ ์๋๋ฐ, ๋ํ์ ์ธ ๊ฒ์ด ์ต์คํ๋ ์ค๋ค.
์ต์คํ๋ ์ค๋ http ๋ชจ๋์ ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ ๋ถ์ฌํ๋ค.
// package.json
{
"name": "learn-express",
"version": "0.0.1",
"description": "์ต์คํ๋ ์ค๋ฅผ ๋ฐฐ์ฐ์",
"main": "app.js",
"scripts": {
"start": "nodemon app"
},
"author": "seol",
"license": "MIT",
}
// app.js
const express = require('express');
const app = express();
app.set('port', process.env.PORT || 3000); // ์๋ฒ๊ฐ ์คํ๋ ํฌํธ ์ค์
app.get('/', (req, res) => { // req: ์์ฒญ ๊ดํ ์ ๋ณด ๋ค์ด์๋ ๊ฐ์ฒด, res: ์๋ต ๊ดํ ์ ๋ณด ๋ค์ด์๋ ๊ฐ์ฒด
res.send('Hello, Express'); // ์ฃผ์์ ๋ํ GET ์์ฒญ์ด ์ฌ ๋ ์ด๋ค ๋์์ ํ ์ง
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
์์ฒญ๊ณผ ์๋ต ์ค๊ฐ์ ์์นํ์ฌ ๋ฏธ๋ค์จ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ๋ํ, ๋ค์ ๋์ค๋ ๋ผ์ฐํฐ์ ์๋ฌ ํธ๋ค๋ฌ ๋ํ ๋ฏธ๋ค์จ์ด์ ์ผ์ข ์ด๋ฏ๋ก ๋ฏธ๋ค์จ์ด๊ฐ ์ต์คํ๋ ์ค์ ์ ๋ถ๋ผ๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋ค. ๋ฏธ๋ค์จ์ด๋ ์์ฒญ๊ณผ ์๋ต์ ์กฐ์ํ์ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๋ ํ๊ณ ๋์ ์์ฒญ์ ๊ฑธ๋ฌ๋ด๊ธฐ๋ ํ๋ค.
๋ฏธ๋ค์จ์ด๋ app.use์ ํจ๊ป ์ฌ์ฉ๋๋ค. => app.use(๋ฏธ๋ค์จ์ด)
// app.js
...
app.set('port', process.env.PORT || 3000);
app.use((req, res, next => {
console.log('๋ชจ๋ ์์ฒญ์ ๋ค ์คํ๋ฉ๋๋ค');
next();
}));
app.get('/', (req, res, next) => {
console.log('GET / ์์ฒญ์์๋ง ์คํ๋ฉ๋๋ค.');
next();
}, (req, res) => {
throw new Error('์๋ฌ๋ ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ก ๊ฐ๋๋ค.')
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
...
๋ฏธ๋ค์จ์ด๋ ์์์๋ถํฐ ์๋๋ก ์์๋๋ก ์คํ๋๋ฉด์ ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์ ํน๋ณํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค. next๋ผ๋ ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ค์ ๋ฏธ๋ค์จ์ด๋ก ๋์ด๊ฐ๋ ํจ์๋ค. next๋ฅผ ์คํํ์ง ์์ผ๋ฉด ๋ค์ ๋ฏธ๋ค์จ์ด๊ฐ ์คํ๋์ง ์๋๋ค.
app.use(๋ฏธ๋ค์จ์ด) | ๋ชจ๋ ์์ฒญ์์ ๋ฏธ๋ค์จ์ด ์คํ |
app.use('/abc', ๋ฏธ๋ค์จ์ด) | abc๋ก ์์ํ๋ ์์ฒญ์์ ๋ฏธ๋ค์จ์ด ์คํ |
app.post('/abc', ๋ฏธ๋ค์จ์ด) | abc๋ก ์์ํ๋ POST ์์ฒญ์์ ๋ฏธ๋ค์จ์ด ์คํ |
app.use๋ app.get ๊ฐ์ ๋ผ์ฐํฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฅ์ฐฉํ ์ ์๋ค.
์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ ๋งค๊ฐ๋ณ์๊ฐ err, req, res, next๋ก ๋ค ๊ฐ๋ค. ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋งค๊ฐ๋ณ์๋ ๋ฐ๋์ ๋ค ๊ฐ์ฌ์ผ ํ๋ค.
์ฌ์ฉ๋ฒ: app.use(morgan('dev'));
์์ฒญ๊ณผ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ์์ ๊ธฐ๋กํ๋ค.
dev ๋ชจ๋ ๊ธฐ์ค์ผ๋ก GET / 500 7.409ms - 50์ ๊ฐ๊ฐ [HTTP ๋ฉ์๋] [์ฃผ์] [HTTP ์ํ ์ฝ๋] [์๋ต ์๋] - [์๋ต ๋ฐ์ดํธ]๋ฅผ ์๋ฏธํ๋ค. ์์ฒญ๊ณผ ์๋ต์ ํ ๋์ ๋ณผ ์ ์์ด ํธ๋ฆฌํ๋ค.
dev ์ธ์ combined, common, short, tiny ๋ฑ์ ๋ฃ์ ์ ์๋ค.
static ๋ฏธ๋ค์จ์ด๋ ์ ์ ์ธ ํ์ผ๋ค์ ์ ๊ณตํ๋ ๋ผ์ฐํฐ ์ญํ ์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๊ธฐ์ ๋ฐ๋ก ์ค์นํ ํ์๋ ์๋ค.
app.use('์์ฒญ ๊ฒฝ๋ก', express.static('์ค์ ๊ฒฝ๋ก'));
app.use('/', express.static(path.join(__dirname, 'public')));
์์ฒญ์ ๋ณธ๋ฌธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํด์ํด์ req.body ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฏธ๋ค์จ์ด๋ค. ํผ ๋ฐ์ดํฐ๋ AJAX ์์ฒญ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฌ๋ ๋ฉํฐํํธ(์ด๋ฏธ์ง, ๋์์, ํ์ผ) ๋ฐ์ดํฐ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฏ๋ก ์ด๋ฐ ๋ฐ์ดํฐ๋ multer ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋๋ค.
app.use(express.json()); // JSON ํ์์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์
app.use(express.urlencoded({extended: false})); // ์ฃผ์ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์
// {extended: false}๋ฉด querystring ๋ชจ๋์ ์ฌ์ฉํด ์ฟผ๋ฆฌ์คํธ๋ง์ ํด์ํ๊ณ ,
// true๋ฉด qs ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ์คํธ๋ง์ ํด์
cookie-parser๋ ์์ฒญ์ ๋๋ด๋ ์ฟ ํค๋ฅผ ํด์ํด req.cookies ๊ฐ์ฒด๋ก ๋ง๋ ๋ค.
ํด์๋ ์ฟ ํค๋ค์ req.cookie ๊ฐ์ฒด์ ๋ค์ด๊ฐ๋ค. ๋ง์ฝ name=seol์ ๋ณด๋๋ค๋ฉด req.cookie๋ {name: 'seol'}๊ฐ ๋๋ค. ์ ํจ๊ธฐ๊ฐ์ด ์ง๋ ์ฟ ํค๋ ์์์ ๊ฑธ๋ฌ๋ธ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋น๋ฐ ํค๋ฅผ ๋ฃ์ด์ค ์ ์๋๋ฐ ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์์ ์์กฐํ๊ธฐ ์ฌ์ฐ๋ฏ๋ก ๋น๋ฐ ํค๋ฅผ ํตํด ๋ง๋ค์ด๋ธ ์๋ช ์ ์ฟ ํค ๊ฐ ๋ค์ ๋ถ์ธ๋ค. name=seol.sign๊ณผ ๊ฐ์ ํํ๊ฐ ๋๋ฉฐ, req.signedCookies ๊ฐ์ฒด์ ๋ค์ด์๋ค.
app.use(cookieParser(๋น๋ฐํค));
์ฟ ํค๋ฅผ ์ง์ฐ๋ ค๋ฉด ํค์ ๊ฐ ์ธ์ ์ต์ ๋ ์ ํํ๊ฒ ์ผ์นํด์ผ ์ฟ ํค๊ฐ ์ง์์ง๋ค.
์ธ์ ๊ด๋ฆฌ์ฉ ๋ฏธ๋ค์จ์ด๋ค. ๋ก๊ทธ์ธ ๋ฑ์ ์ด์ ๋ก ์ธ์ ์ ๊ตฌํํ๊ฑฐ๋ ํน์ ์ฌ์ฉ์๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํด๋ ๋ ์ ์ฉํ๋ค. ์ธ์ ์ ์ฌ์ฉ์๋ณ๋ก req.session ๊ฐ์ฒด ์์ ์ ์ง๋๋ค.
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
express-session์ ์ธ์ ๊ด๋ฆฌ ์ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ฅผ ๋ณด๋ธ๋ค.
์ด๋ฏธ์ง, ๋์์ ๋ฑ์ ๋น๋กฏํ ์ฌ๋ฌ ๊ฐ์ง ํ์ผ๋ค์ ๋ฉํฐํํธ ํ์์ผ๋ก ์ ๋ก๋ํ ๋ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด๋ค. ๋ฉํฐํํธ ํ์์ด๋ enctype์ด multipart/from-data์ธ ํผ์ ํตํด ์ ๋ก๋ํ๋ ๋ฐ์ดํฐ์ ํ์์ ์๋ฏธํ๋ค.
app.use(morgan('dev'));
๋๋
app.use((req, res, next) => {
morgan('dev')(req, res, next);
});
app.get ๊ฐ์ ๋ฉ์๋๋ ๋ผ์ฐํฐ ๋ถ๋ถ์ด๋ค. ๋ผ์ฐํฐ๋ฅผ ๋ง์ด ์ฐ๊ฒฐํ๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฏ๋ก ์ต์คํ๋ ์ค๋ ๋ผ์ฐํฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
// routes/index.js
const express = require('express');
const router = express.Router();
// GET / ๋ผ์ฐํฐ
router.get('/', (req, res) => {
res.send('Hello, Express');
});
module.exports = router;
// routes/user.js
const express = require('express');
const router = express.Router();
// GET /user ๋ผ์ฐํฐ
router.get('/', (req, res) => {
res.send('Hello, User');
});
// app.js
...
const indexRouter = require('./routes');
const userRouter = require('./routes/user);
...
app.use('/', indexRouter);
app.use('/user', userRouter);
app.use๋ก ์ฐ๊ฒฐํ ๋๋ ์ฃผ์๊ฐ ํฉ์ณ์ง๋ค.
router.get('/user/:id', function(req, res) {
console.log(req.params, req.query);
});
์์ ์ฃผ์๋ ์์ฃผ ์ฐ์ด๋ ํจํด์ด๋ค. ์ฃผ์์ :id๊ฐ ์๋๋ฐ, ์ด ๋ถ๋ถ์๋ ๋ค๋ฅธ ๊ฐ์ ๋ฃ์ ์ ์๋ค. /user/1์ด๋ /user/123 ๋ฑ์ ์์ฒญ๋ ์ด ๋ผ์ฐํฐ๊ฐ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. ์ด ๋ฐฉ์์ ์ฅ์ ์ :id์ ํด๋นํ๋ 1์ด๋ 123์ ์กฐํํ ์ ์๋ค๋ ์ ์ด๋ฉฐ, req.params ๊ฐ์ฒด ์์ ๋ค์ด ์๋ค. ๋ค๋ง ์ฃผ์ํ ์ ์ ์ผ๋ฐ ๋ผ์ฐํฐ๋ณด๋ค ๋ค์ ์์นํด์ผ ํ๋ค๋ ์ ์ด๋ค.
์ต์คํ๋ ์ค์ req, res ๊ฐ์ฒด๋ http ๋ชจ๋์ req, res ๊ฐ์ฒด๋ฅผ ํ์ฅํ ๊ฒ์ด๋ค. ๊ธฐ์กด์ http ๋ชจ๋์ ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๊ณ , ์ต์คํ๋ ์ค๊ฐ ์ถ๊ฐํ ๋ฉ์๋๋ ์์ฑ์ ์ฌ์ฉํ ์๋ ์๋ค.
ํ ํ๋ฆฟ ์์ง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด์ HTML์ ๋ ๋๋งํ ์ ์๊ฒ ํ๋ค. ๋ฐ๋ผ์ HTML๊ณผ๋ ๋ฌธ๋ฒ์ด ์ด์ง ๋ค๋ฅผ ์๋ ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ด ๋ค์ด ์๊ธฐ๋ ํ๋ค.
๋ฌธ๋ฒ์ด ๊ฐ๋จํด ์ฝ๋์ ์์ด ์ค์ด๋ค์ง๋ง, HTML๊ณผ๋ ๋ฌธ๋ฒ์ด ๋ง์ด ๋ฌ๋ผ ํธ๋ถํธ๊ฐ ๋ฌ๋ฆฐ๋ค.
๊ธฐ์กด HTML๊ณผ๋ ๋ค๋ฅด๊ฒ ํ์ด๊ดํธ(<>)์ ๋ซ๋ ํ๊ทธ๊ฐ ์๋ค. ํญ ๋๋ ์คํ์ด์ค๋ก๋ง ํ๊ทธ์ ๋ถ๋ชจ ์์ ๊ด๊ณ๋ฅผ ๊ท๋ช ํ๋ค.
ํผ๊ทธ | HTML |
doctype html html head title = title linke(rel='stylesheet', href='/stylesheets/style.css') |
<!DOCTYPE html> <html> <head> <title>์ต์คํ๋ ์ค</title> <link rel="stylesheet" href="/style.css" /> </head> </html> |
์์ฑ ์ค ์์ด๋์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด ํํํ๋ฉฐ, div ํ๊ทธ์ธ ๊ฒฝ์ฐ div ๋ฌธ์๋ ์๋ต ๊ฐ๋ฅํ๋ค.
ํผ๊ทธ | HTML |
#login-button .post-imagee span#highlight p.hidden.full |
<div id="login-button"></div> |
HTML ํ ์คํธ๋ ์๋์ ๊ฐ์ด ํ๊ทธ ๋๋ ์์ฑ ๋ค์ ํ ์นธ์ ๋๊ณ ์ ๋ ฅํ๋ค.
ํผ๊ทธ | HTML |
p Welcome to Express button(type='submit') ์ ์ก |
<p>Welcome to Express</p> <button type="submit">์ ์ก</button> |
์๋ํฐ์์ ํ ์คํธ๋ฅผ ์ฌ๋ฌ ์ค ์ ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ํ์ดํ(|)๋ฅผ ๋ฃ๋๋ค.
ํผ๊ทธ | HTML |
p | ์๋ ํ์ธ์. | ์ฌ๋ฌ ์ค์ ์ ๋ ฅํฉ๋๋ค. br | ํ๊ทธ๋ ์ค๊ฐ์ ๋ฃ์ ์ ์์ต๋๋ค. |
<p>์๋
ํ์ธ์ ์ฌ๋ฌ ์ค์ ์
๋ ฅํฉ๋๋ค. <br /> ํ๊ทธ๋ ์ค๊ฐ์ ๋ฃ์ ์ ์์ต๋๋ค. </p> |
style์ด๋ script ํ๊ทธ๋ก CSS ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด ํ๊ทธ ๋ค์ ์ (.)์ ๋ถ์ธ๋ค.
ํผ๊ทธ | HTML |
style. h1 { font-size: 30px; } script. const message = 'Pug'; alert(message); |
<style> h1 { font-size: 30px; } </style> <script> const message = 'Pug'; alert(message); </script> |
ํผ๊ทธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ฅผ ํ ํ๋ฆฟ์ ๋ ๋๋งํ ์ ์๋ค.
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' }); // render(ํ
ํ๋ฆฟ, ๋ณ์ ๊ฐ์ฒด)
});
๋ณ์๋ฅผ ํ ์คํธ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ๊ทธ ๋ค์ =๋ฅผ ๋ถ์ธ ํ ๋ณ์ ์ ๋ ฅํ๊ณ , ํ ์คํธ ์ค๊ฐ์ ๋ณ์๋ฅผ ๋ฃ์ผ๋ ค๋ฉด #{๋ณ์}๋ฅผ ์ ๋ ฅํ๋ค.
ํผ๊ทธ | HTML |
- const node = 'Node.js' - const js = 'Javascript' p #{node}์ #{js} |
<p>Node.js์ Javascript</p> |
๋ฐ๋ณต๋ฌธ๋ ์ฌ์ฉํ ์ ์๊ณ , ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ณ์์ธ ๊ฒฝ์ฐ์๋ง ํด๋น๋๋ค. each๋ก ๋ฐ๋ณต๋ฌธ ๋๋ฆด ์ ์์ผ๋ฉฐ, for๋ฅผ ๋์ ์จ๋ ๋๋ค.
ํผ๊ทธ | HTML |
ul each fruit in ['์ฌ๊ณผ', '๋ฐฐ', '์ค๋ ์ง', '๋ฐ๋๋', '๋ณต์ญ์'] li = fruit |
<ul> <li>์ฌ๊ณผ</li> <li>๋ฐฐ</li> <li>์ค๋ ์ง</li> <li>๋ฐ๋๋</li> <li>๋ณต์ญ์</li> </ul> |
๋ฐ๋ณต๋ฌธ ์ฌ์ฉ์ ์ธ๋ฑ์ค๋ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํผ๊ทธ | HTML |
ul each fruit in ['์ฌ๊ณผ', '๋ฐฐ', '์ค๋ ์ง', '๋ฐ๋๋', '๋ณต์ญ์'] li = (index + 1) + '๋ฒ์งธ ' + fruit |
<ul> <li>1๋ฒ์งธ ์ฌ๊ณผ</li> <li>2๋ฒ์งธ ๋ฐฐ</li> <li>3๋ฒ์งธ ์ค๋ ์ง</li> <li>4๋ฒ์งธ ๋ฐ๋๋</li> <li>5๋ฒ์งธ ๋ณต์ญ์</li> </ul> |
์กฐ๊ฑด๋ฌธ์ผ๋ก ํธํ๊ฒ ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์ ์๊ณ , if, else if, else ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํผ๊ทธ | HTML |
if isLoggedIn div ๋ก๊ทธ์ธ ๋์์ต๋๋ค. else div ๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค. |
<!-- isLoggedIn์ด true์ผ ๋ --> <div>๋ก๊ทธ์ธ์ด ๋์์ต๋๋ค.</div> <!-- isLoggedIn์ด false์ผ ๋ --> <div>๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค</div> |
case๋ฌธ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํผ๊ทธ | HTML |
case fruit when 'apple' p ์ฌ๊ณผ์ ๋๋ค. when 'apple' p ๋ฐ๋๋์ ๋๋ค. when 'apple' p ์ค๋ ์ง์ ๋๋ค. when 'apple' p ์ฌ๊ณผ๋ ๋ฐ๋๋๋ ์ค๋ ์ง๋ ์๋๋๋ค. |
<!-- fruit์ด apple์ผ ๋ --> <p>์ฌ๊ณผ์ ๋๋ค.</p> <!-- fruit์ด banana์ผ ๋ --> <p>๋ฐ๋๋์ ๋๋ค.</p> <!-- fruit์ด orange์ผ ๋ --> <p>์ค๋ ์ง์ ๋๋ค.</p> <!-- ๊ธฐ๋ณธ๊ฐ --> <p>์ฌ๊ณผ๋ ๋ฐ๋๋๋ ์ค๋ ์ง๋ ์๋๋๋ค.</p> |
๋์ ์ค๋ ํผ๊ทธ์ HTML ๋ฌธ๋ฒ ๋ณํ์ ์ ์ํ๊ธฐ ํ๋ ๋ถ์๊ฒ ์ ํฉํ ํ ํ๋ฆฟ ์์ง์ด๋ฉฐ, HTML ๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ์ถ๊ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๊ณ , ํ์ด์ฌ์ ํ ํ๋ฆฟ ์์ง์ธ Twig์ ๋ฌธ๋ฒ์ด ์๋นํ ์ ์ฌํ๋ค.
res.render ํธ์ถ ์ ๋ณด๋ด๋ ๋ณ์๋ฅผ ๋์ ์ค๊ฐ ์ฒ๋ฆฌํ๋ค.
router.get('/', function(req, res, next) {
res.render('index', {title: 'Express'});
});
๋์ ์ค์์ ๋ณ์๋ {{ }}๋ก ๊ฐ์ผ๋ค.
๋์ ์ค | HTML |
<h1>{{title}}</h1> <p>Welcome to {{title}}</p> <button class="{{title}}" type |
<h1>Express</h1> <p>Welcome to Express</p> <button class="Express" type="submit">์ ์ก</button> <input placeholder="Express ์ฐ์ต" /> |
๋ด๋ถ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ๋ณ์๋ฅผ ์ ์ธํ ๋๋ {% set ๋ณ์ = '๊ฐ' %}๋ฅผ ์ฌ์ฉํ๋ค.
๋์ ์ค | HTML |
{% set node = 'Node.js' %} {% set js = 'Javascript' %} <p>{{node}}์ {{js}}</p> |
<p>Node.js์ Javascript</p> |
HTML์ ์ด์ค์ผ์ดํํ๊ณ ์ถ์ง ์๋ค๋ฉด {{๋ณ์ | safe}}๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์ ์ค | HTML |
<p>{{'<strong>์ด์ค์ผ์ดํ</strong>'}}</p> <p>{{'<strong>์ด์ค์ผ์ดํํ์ง ์์</strong>' | safe}}</p> |
<p><strong>์ด์ค์ผ์ดํ</strong></p> <p><strong>์ด์ค์ผ์ดํํ์ง ์์</strong></p> |
๋์ ์ค์์๋ ํน์ํ ๊ตฌ๋ฌธ์ {% %} ์์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ๋ ์ด ์์ ๋ฃ์ผ๋ฉด ๋๋ค. for in๋ฌธ๊ณผ endfor ์ฌ์ด์ ์์นํ๋ฉด ๋๋ค.
๋์ ์ค | HTML |
<ul> {% set fruits = ['์ฌ๊ณผ', '๋ฐฐ', '์ค๋ ์ง', '๋ฐ๋๋', '๋ณต์ญ์'] %} {% for item in fruits %} <li>{{item}}</li> {% endfor %} </ul> |
<ul> <li>์ฌ๊ณผ</li> <li>๋ฐฐ</li> <li>์ค๋ ์ง</li> <li>๋ฐ๋๋</li> <li>๋ณต์ญ์</li> </ul> |
๋ฐ๋ณต๋ฌธ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด loop.index๋ผ๋ ํน์ํ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋์ ์ค | HTML |
<ul> {% set fruits = ['์ฌ๊ณผ', '๋ฐฐ', '์ค๋ ์ง', '๋ฐ๋๋', '๋ณต์ญ์'] %} {% for item in fruits %} <li>{{loop.index}}๋ฒ์งธ {{item}}</li> {% endfor %} </ul> |
<ul> <li>1๋ฒ์งธ ์ฌ๊ณผ</li> <li>2๋ฒ์งธ ๋ฐฐ</li> <li>3๋ฒ์งธ ์ค๋ ์ง</li> <li>4๋ฒ์งธ ๋ฐ๋๋</li> <li>5๋ฒ์งธ ๋ณต์ญ์</li> <ul> |
์กฐ๊ฑด๋ฌธ์ {% if ๋ณ์ %} {% elif %} {% endif %}๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๋์ ์ค | HTML |
{% if isLoggedIn %} <div>๋ก๊ทธ์ธ ๋์์ต๋๋ค.</div> {% else %} <div>๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.<div> {% endif %} |
<!-- isLoggedIn์ด true์ผ ๋ --> <div>๋ก๊ทธ์ธ ๋์์ต๋๋ค.</div> <!-- isLoggedIn์ด false์ผ ๋ --> <div>๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.</div> |
case๋ฌธ ์์ง๋ง elif(else if ์ญํ )๋ฅผ ํตํด ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์ ์๋ค.
๋์ ์ค | HTML |
{% if fruit === 'apple' %} <p>์ฌ๊ณผ์ ๋๋ค.</p> {% elif fruit === 'banana' %} <p>๋ฐ๋๋์ ๋๋ค.</p> {% elif fruit === 'banana' %} <p>์ค๋ ์ง์ ๋๋ค.</p> {% else %} <p>์ฌ๊ณผ๋ ๋ฐ๋๋๋ ์ค๋ ์ง๋ ์๋๋๋ค.</p> {% endif %} |
<!-- fruit๊ฐ apple์ผ ๋ --> <p>์ฌ๊ณผ์ ๋๋ค.</p> <!-- fruit๊ฐ banana์ผ ๋ --> <p>๋ฐ๋๋์ ๋๋ค.</p> <!-- fruit๊ฐ orange์ผ ๋ --> <p>์ค๋ ์ง์ ๋๋ค.</p> <!-- ๊ธฐ๋ณธ๊ฐ --> <p>์ฌ๊ณผ๋ ๋ฐ๋๋๋ ์ค๋ ์ง๋ ์๋๋๋ค.</p> |
[Node.js] 8์ฅ ๋ชฝ๊ณ ๋๋น (0) | 2022.11.17 |
---|---|
[Node.js] 7์ฅ MySQL (0) | 2022.11.10 |
[Node.js] 5์ฅ ํจํค์ง ๋งค๋์ (0) | 2022.10.13 |
[Node.js] 4์ฅ http ๋ชจ๋๋ก ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2022.10.06 |
[Node.js] 3์ฅ ๋ ธ๋ ๊ธฐ๋ฅ (0) | 2022.09.29 |