๐ Express๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ api ๋ง๋ค๊ธฐ(DB ์ฌ์ฉํ์ง ์์)
// @ts-check
const express = require('express');
const app = express();
const PORT = 4000;
const userRouter = express.Router();
const postsRouter = express.Router();
const USER = [
{
id: 'bulsok',
name: 'ebulsok',
},
{
id: 'test',
name: 'ํ
์คํธ',
},
];
app.use('/users', userRouter);
app.use('/posts', postsRouter);
๐ฉ ํ์ ๋ชฉ๋ก ๋ณด์ฌ์ฃผ๊ธฐ api
GET localhost:4000/users
userRouter.get('/', (req, res) => {
res.send(USER);
});
๐ฉ ํน์ ํ์ ์ ๋ณด ๋ณด์ฌ์ฃผ๊ธฐ api
GET localhost:4000/users/:id
userRouter.get('/:userID', (req, res) => {
const userData = USER.find((user) => user.id === req.params.id);
if (userData) res.send(userData);
else res.end('ID not found');
});
๐ฉ ํ์ ์ถ๊ฐํ๊ธฐ api
POST localhost:4000/users?id=test&name=test
userRouter.post('/', (req, res) => {
if (req.query.id && req.query.name) {
const newUser = {
id: req.query.id,
name: req.query.name,
};
USER.push(newUser);
res.send('ํ์ ๋ฑ๋ก ์๋ฃ');
} else res.end('Unexpected query');
});
๐ฉ ํ์ ์์ ํ๊ธฐ api
PUT localhost:4000/users/:id?id=test&name=test
userRouter.put('/:userID', (req, res) => {
if (req.query.id && req.query.name) {
const arrIndex = USER.findIndex((user) => user.id === req.params.userID);
if (arrIndex !== -1) {
USER[arrIndex].id = req.query.id;
USER[arrIndex].name = req.query.name;
res.send('ํ์์ ๋ณด ์์ ์๋ฃ');
} else res.end('ํ์์ ๋ณด๊ฐ ์์ต๋๋ค.');
} else res.end('Unexpected query');
});
๐ฉ ํ์ ์ญ์ ํ๊ธฐ api
DELETE localhost:4000/users/:id
userRouter.delete('/:userID', (req, res) => {
const arrIndex = USER.findIndex((user) => user.id === req.params.userID);
if (arrIndex !== -1) {
USER.splice(arrIndex, 1);
res.send('ํ์ ์ญ์ ์๋ฃ');
} else res.end('ํ์์ ๋ณด๊ฐ ์์ต๋๋ค.');
});
๐ View Engine
๐ฉ EJS
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ view engine
- HTML ๋ฌธ๋ฒ์ ์ฌ์ฉ
- ๋จ, ๋ ์ด์์ ๊ธฐ๋ฅ X
๐ฉ pug
- HTML ๋ฌธ๋ฒ์ ๋จ์ํํ์ฌ ์ฌ์ฉ
- ๋ ์ด์์ ๊ธฐ๋ฅ O
๐ฉ NUNJUCKS
- HTML ๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉ
- ๋ ์ด์์ ๊ธฐ๋ฅ O
- [ํฐ๋ฏธ๋] npm i -D ejs
- express์๊ฒ ์ด๋ค view engine์ผ๋ก ์นํ์ด์ง๋ฅผ ๊ทธ๋ฆด ๊ฒ์ธ์ง ์๋ ค์ฃผ๊ธฐ
app.set('view engine', 'ejs');
app.set('views', 'views');
- ํด๋ ๊ฐ์ฅ ์ธ๋ถ์ views ํด๋ ๋ง๋ค๊ธฐ
- views ํด๋ ๋ด๋ถ์ index.ejs ํ์ผ ๋ง๋ค๊ณ ์ฝ๋ ์ ๋ ฅํ๊ธฐ
- localhost:4000/users ๊ธฐ๋ณธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด index.ejs ํ์ผ ๋์ฐ๊ธฐ
userRouter.get('/', (req, res) => {
// res.send(USER);
res.render('index');
});
- res.render('ejs ํ์ผ๋ช ', { ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ });
- ์ค๋ธ์ ํธ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ejs ํ์ผ ๋ด๋ถ์์ <%= %>๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ธ์ ํธ์ ํ๋๋ช ์ผ๋ก ํธ์ถ
<body>
<h1>ํ์ ๋ชฉ๋ก</h1>
<h2>์ด ํ์ ์: <%= userCounts %></h2>
<ul>
<li>
<p>ID: <%= USER[0].id %></p>
<p>NAME: <%= USER[0].name %></p>
</li>
</ul>
</body>
๐ฉ if / for ๋ฌธ ์ฌ์ฉํ๊ธฐ: <% %>
<body>
<h1>ํ์ ๋ชฉ๋ก</h1>
<h2>์ด ํ์ ์: <%= userCounts %></h2>
<ul>
<% if (userCounts > 0) { %>
<% for(let i = 0; i < userCounts; i++) { %>
<li>
<p>ID: <%= USER[i].id %></p>
<p>NAME: <%= USER[i].name %></p>
</li>
<% } %>
<% } else { %>
<li>
ํ์ ์ ๋ณด๊ฐ ์์ต๋๋ค!
</li>
<% } %>
</ul>
</body>
๐ฉ CSS ์ ์ฉํ๊ธฐ
- views/css/style.css ์์ฑ
- index.js ํ์ผ์ <link rel="stylesheet" href="./css/style.css"> ๊ฑธ์์ ๋ ์๋๋ ์ด์ : URL๊ณผ back-end ํด๋ ๊ตฌ์กฐ๊ฐ ๋์ผํ๋ค๋ฉด ํดํน ์ํ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ express ๊ฐ์ ํ๋ ์์ํฌ์์๋ static์ด๋ผ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ๊ณต
app.use(express.static('views'));
- static์ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ํด๋ ๊ฒฝ๋ก์ ์์์ ์ localhost:4000/views๊ฐ ๋จ
- ์ฌ๋ฌ๊ฐ ํด๋๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ๋ณดํต public์ด๋ผ๋ ํด๋๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํด๋๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ css, js, ์ด๋ฏธ์ง ๋ฑ์ ์์น์ํด
๐ express ๊ธฐ๋ณธ ํด๋ ๊ตฌ์กฐ
- /public : ์ธ๋ถ(๋ธ๋ผ์ฐ์ ๋ฑ ํด๋ผ์ด์ธํธ)์์ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ผ ๋ชจ์๋ (/images, /js, /css)
- /routes : ํ์ด์ง ๋ผ์ฐํ ๊ณผ ๊ด๋ จ๋ ํ์ผ ์ ์ฅ
- /views : jade, ejs ํ์ผ ๋ฑ ํ ํ๋ฆฟ ํ์ผ ๋ชจ์๋ . ์น ์๋ฒ ์ฌ์ฉ ์ ์ด ํด๋์ ํ์ผ๋ค์ ์ฌ์ฉํด ๋ ๋๋ง
- /app.js : ํต์ฌ์ ์ธ ์๋ฒ ์ญํ , ๋ฏธ๋ค์จ์ด ๊ด๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง, ๋ผ์ฐํ ์ ์์์
- /package.json : npm์ ์์กด์ฑ ํ์ผ, ํ์ฌ ํ๋ก์ ํธ์ ์ฌ์ฉ๋ ๋ชจ๋์ ์ค์น(npm install)ํ๋๋ฐ ํ์ํ ๋ด์ฉ์ ๋ด์
- /bin/www : ์๋ฒ๋ฅผ ์คํํ๋ ์คํฌ๋ฆฝํธ, ํ๋ก์ ํธ ๋์๊ฐ๋ ํฌํธ๋ฒํธ ๋ฐ๊ฟ ์ ์์
๐ฉ ๊ธฐ๋ฅ์ ํ์ผ๋ก ๋ถ๋ฆฌํ๊ณ ๋ชจ๋ํํ๊ธฐ
// app.js
const userRouter = require('./routes/users');
app.use('/users', userRouter);
// routes/users.js
module.exports = router;
<!-- index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index</title>
</head>
<body>
<h1>Hello, Express Service</h1>
<h2><a href="/users">Move to USER service</a></h2>
</body>
</html>
๐ Error ํธ๋ค๋ง
- ์๋ฒ err๊ฐ ๋ฐ์ํ๋ฉด ์ ์์ ์ผ๋ก๋ err๋ฅผ ๋ฐ์์ํจ ๋ค์ ๋ฉ์์ง์ statuscode๋ฅผ ์ ๋ฌํด์ค์ผ ํจ
// ํ์ ๋ชฉ๋ก
router.get('/', (req, res) => {
const userLen = USER.length;
res.render('users', { USER, userCounts: userLen, imgName: 'img1.jpg' });
});
// ํ์ ์ ๋ณด(id)
router.get('/:userID', (req, res) => {
const userData = USER.find((user) => user.id === req.params.userID);
if (userData) res.send(userData);
else {
const err = new Error('ID not found');
err.statusCode = 404;
throw err;
// res.end('ID not found');
}
});
// ํ์ ๋ฑ๋ก
router.post('/', (req, res) => {
if (req.query.id && req.query.name && req.query.email) {
const newUser = {
id: req.query.id,
name: req.query.name,
email: req.query.email,
};
USER.push(newUser);
res.send('ํ์ ๋ฑ๋ก ์๋ฃ');
} else {
const err = new Error('Unexpected query');
err.statusCode = 404;
throw err;
}
});
// ํ์ ์ ๋ณด ์์
router.put('/:userID', (req, res) => {
if (req.query.id && req.query.name && req.query.email) {
const arrIndex = USER.findIndex((user) => user.id === req.params.userID);
if (arrIndex !== -1) {
USER[arrIndex].id = req.query.id;
USER[arrIndex].name = req.query.name;
USER[arrIndex].email = req.query.email;
res.send('ํ์์ ๋ณด ์์ ์๋ฃ');
} else {
const err = new Error('ID not found');
err.statusCode = 404;
throw err;
}
} else {
const err = new Error('Unexpected query');
err.statusCode = 404;
throw err;
}
});
// ํ์ ์ญ์
router.delete('/:userID', (req, res) => {
const arrIndex = USER.findIndex((user) => user.id === req.params.userID);
if (arrIndex !== -1) {
USER.splice(arrIndex, 1);
res.send('ํ์ ์ญ์ ์๋ฃ');
} else {
const err = new Error('ID not found');
err.statusCode = 404;
throw err;
}
});
- app.js์ ๋ฏธ๋ค์จ์ด ์ค ๋ง์ง๋ง์ throw๋ err๋ฅผ ๋ฐ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐ
app.use((err, req, res, next) => {
console.log(err.stack);
res.status(err.statusCode);
res.send(err.message);
});
- ํด๋น ๋ฏธ๋ค์จ์ด๋ err์ธ์์ res๋ฅผ ๊ฐ์ด ์จ์ผ ํ๋ฏ๋ก app.use() ๋ฉ์๋์ ์ธ์๋ฅผ ์ ๋ถ ์ฌ์ฉํด์ผ ํจ.
- 3๊ฐ๋ง ์ธ ๊ฒฝ์ฐ req, res, next๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ err๋ฅผ ๋ฐ์ง ๋ชป ํจ
'KDT > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
9/14 TIL : ๊ฒ์ํ ๊ธฐ๋ฅ์ MongoDB ์ ์ฉ, ์๋ฒ ๋ฐฐํฌ (0) | 2022.09.20 |
---|---|
9/7 TIL : form ํ๊ทธ๋ก ๋ฐ์ดํฐ ์ ๋ฌ, fetch, MongoDB (0) | 2022.09.18 |
9/2 TIL : ์ ๊ฐ ๊ตฌ๋ฌธ, yarn, postman, express router (0) | 2022.09.18 |
8/31 TIL : File-system(JS, Promise, async/await), Routing w/o framework (0) | 2022.09.18 |
8/29 TIL : JSDoc, ํ๋ ์์ํฌ ์์ด CRUD ๊ตฌํ, JS module (0) | 2022.09.15 |