Express
Node.js 웹 프레임워크
🍡 Middleware
use()
const express = require('express');const server = express();const PORT = 4000;// http://localhost:4000/server.use('/', (req, res, next) => {res.send('Hello!');});server.listen(PORT, () => {console.log(`익스프레스 서버가 ${PORT}번 포트에서 작동 중입니다.`);});-----------------------------------------------------// 프론트 //// Hello!// 백 //// 익스프레스 서버가 4000번 포트에서 작동 중입니다.
next()
const express = require('express');const server = express();const PORT = 4000;// http://localhost:4000/server.use('/', (req, res, next) => {console.log('미들웨어 1');req.reqTime = new Date();next();});server.use((req, res, next) => {console.log('미들웨어 2');res.send(`요청 시간은 ${req.reqTime} 입니다.`);});server.listen(PORT, () => {console.log(`익스프레스 서버가 ${PORT}번 포트에서 작동 중입니다.`);});-----------------------------------------------------// 프론트 //// 요청 시간은 Wed Mar 08 2023 14:46:54 GMT+0900 (대한민국 표준시) 입니다.// 백 //// 익스프레스 서버가 4000번 포트에서 작동 중입니다.// 미들웨어 1// 미들웨어 2
Promise 사용하기
const fs = require('fs').promises;const express = require('express');const server = express();const PORT = 4000;// http://localhost:4000/server.use('/', async (req, res, next) => {console.log('미들웨어 1');req.reqTime = new Date();req.fileContent = await fs.readFile('../package.json', 'utf-8');next();});server.use((req, res, next) => {console.log('미들웨어 2');console.log(`요청 시간은 ${req.reqTime} 입니다.`,`pakage.json의 내용을 보여드릴게요! \n ${req.fileContent}`);res.send(req.fileContent);});server.listen(PORT, () => {console.log(`익스프레스 서버가 ${PORT}번 포트에서 작동 중입니다.`);});-----------------------------------------------------// 프론트 //// (package.json의 내용)// 백 //// 미들웨어 1// 미들웨어 2// 요청 시간은 Wed Mar 08 2023 14:46:54 GMT+0900 (대한민국 표준시) 입니다. pakage.json의 내용을 보여드릴게요!// (package.json의 내용)
☁️ CRUD
요청 메소드
HTTP Status
메소드 사용하기
// @ts-checkconst express = require('express');const app = express();const PORT = 4000;app.get('/', (req, res) => {res.send('GET 메소드');});app.post('/', (req, res) => {res.send('POST 메소드');});app.put('/', (req, res) => {res.send('PUT 메소드');});app.delete('/', (req, res) => {res.send('DELETE 메소드');});app.listen(PORT, () => {console.log(`서버가 ${PORT}번에서 실행 중입니다.`);});
💫 URL로 Data를 받는 방법
주소 값에 프론트에서 받아야 하는 정보를 담아서 받는 방법
Req.params
const express = require('express');const app = express();const PORT = 4000;// http://localhost:4000/(id)app.get('/id/:id/name/:name/gender/:gender', (req, res) => {console.log(req.params);res.send(req.params);});app.listen(PORT, () => {console.log(`${PORT}번에서 서버 실행 중 . . .`);});-----------------------------------------------------// 요청 URL //localhost:4000/id/j56237/name/ke/gender/male// 프론트 //{"id": "j56237","name": "ke","gender": "male"}// 백 //{"id": "j56237","name": "ke","gender": "male"}
Req.query
const express = require('express');const app = express();const PORT = 4000;// http://localhost:4000/(id)app.get('/', (req, res) => {console.log(req.query);res.send(req.query);});app.listen(PORT, () => {console.log(`${PORT}번에서 서버 실행 중 . . .`);});-----------------------------------------------------// 요청 URL //localhost:4000?id=ke&gender=male// 프론트 //{"id": "ke","gender": "male"}// 백 //{"id": "ke","gender": "male"}
💨 Router
// routes/users.jsconst express = require('express');const app = express();const userRouter = express.Router();const PORT = 4000;app.use('/users', userRouter);app.get('/', (req, res) => {res.send('Hello, Express World!');});// http://localhost:4000/usersuserRouter.get('/', (req, res) => {res.send('회원 목록');});userRouter.get('/id/:id', (req, res) => {res.send('특정 회원 정보');});userRouter.post('/add', (req, res) => {res.send('회원 등록');});app.listen(PORT, () => {console.log(`${PORT}번에서 실행 중 . . .`);});
실습 - 회원정보 수정 API 만들기
// @ts-checkconst express = require('express');const app = express();const userRouter = express.Router();const PORT = 4000;const USER = {1: {id: 'jke123',name: '장경은',},};app.use('/users', userRouter);app.get('/', (req, res) => {res.send('Hello, Express World!');});// http://localhost:4000/usersuserRouter.get('/', (req, res) => {res.send(USER);});userRouter.get('/id/:id', (req, res) => {const userData = USER[req.params.id];if (userData) {res.send(userData);} else {res.send('Cannot Found');}});userRouter.post('/add', (req, res) => {// query에 id와 name이 존재할 때만if (req.query.id && req.query.name) {const newUser = {id: req.query.id,name: req.query.name,};// USER 객체의 현재 길이 +1을 새로운 아이디로 함USER[Object.keys(USER).length + 1] = newUser;res.send('회원 등록 완료!');} else {res.send('요청이 잘못되었습니다.');}});userRouter.put('/modify/:id', (req, res) => {const num = req.params.id;// USER 객체에 키가 num인 값이 존재하지 않으면if (!USER[num]) {return res.send('요청하신 ID가 없습니다.');}// query에 id와 name이 존재할 때만if (req.query.id && req.query.name) {const modifiedUser = {id: req.query.id,name: req.query.name,};USER[num] = modifiedUser;res.send('회원 수정 완료!');} else {res.send('요청이 잘못되었습니다.');}});userRouter.delete('/delete/:id', (req, res) => {const num = req.params.id;// USER 객체에 키가 num인 값이 존재하면if (USER[num]) {delete USER[num];res.send('회원 삭제 완료!');} else {res.send('요청하신 ID가 없습니다.');}});app.listen(PORT, () => {console.log(`${PORT}번에서 실행 중 . . .`);});
🦴 EJS
// @ts-checkconst express = require('express');const app = express();const userRouter = express.Router();const PORT = 4000;const userArr = [{id: 'jke123',name: '장경은',},{id: 'pororo',name: '뽀로로',},];userRouter.get('/ejs', (req, res) => {const userCounts = userArr.length;res.render('index', { userArr, userCounts });});
// index.ejs<body><h1>Hello, EJS world!</h1><h1>회원 목록</h1><h2>총 회원 수 <%= userCounts %></h2><ul><li><p>ID : <%= userArr[0].id %></p><p>NAME : <%= userArr[0].name %></p></li></ul></body>
// index.ejs<body><h1>Hello, EJS world!</h1><h1>회원 목록</h1><h2>총 회원 수 <%= userCounts %></h2><ul><% if(userCounts > 0) { %><% for(let i = 0; i < userCounts; i++) { %><li><p>ID : <%= userArr[i].id %></p><p>NAME : <%= userArr[i].name %></p></li><% } %><% } else { %><li>회원 정보가 없습니다!</li><% } %></ul></body>
⚠️ Error 핸들링
const err = new Error('해당 ID를 가진 회원이 존재하지 않습니다!');err.statusCode = 404;throw err;
app.use((err, req, res, next) => {console.log(err.stack);res.status(err.statusCode);res.send(err.message + `<a href="/">홈으로</a>`);});
⌨️ form으로 데이터 받아오기
<form action="/users/add" method="POST"><div><label>아이디</label><input type="text" name="id" /></div><div><label>이름</label><input type="text" name="name" /></div><div><label>이메일</label><input type="text" name="email" /></div><button type="submit">제출</button></form>
const bodyParser = require('body-parser');app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));
router.post('/add', (req, res) => {if (Object.keys(req.query).length >= 1) {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('ID, Name, Email을 모두 입력하여야 합니다.');err.statusCode = 400;throw err;}} else if (req.body) {if (req.body.id && req.body.name && req.body.email) {const newUser = {id: req.body.id,name: req.body.name,email: req.body.email,};USER.push(newUser);res.redirect('/users');} else {const err = new Error('ID, Name, Email을 모두 입력하여야 합니다.');err.statusCode = 400;throw err;}} else {const err = new Error('ID, Name, Email을 모두 입력하여야 합니다.');err.statusCode = 400;throw err;}});
🥛 DB와 연동된 게시판 만들기
Controllers
// dbConnect.js //const mysql = require('mysql');const connection = mysql.createConnection({host: 'localhost',user: 'root',password: '12341234',port: '3306',database: 'mydb',});connection.connect();module.exports = connection;
// boardController.js //const connection = require('./dbConnect');const boardDB = {// 모든 게시글 가져오기getAllArticles: (cb) => {connection.query('SELECT * FROM mydb.board', (err, data) => {if (err) throw err;cb(data);});},// 게시글 추가하기wrtieArticle: (newArticle, cb) => {connection.query(`INSERT INTO mydb.board (TITLE, CONTENT) VALUES ('${newArticle.title}', '${newArticle.content}');`,(err, data) => {if (err) throw err;cb(data);},);},// 특정 ID 값을 가지는 게시글 찾기getArticle: (id, cb) => {connection.query(`SELECT * FROM mydb.board WHERE ID_PK = ${id};`,(err, data) => {if (err) throw err;cb(data);},);},// 글 수정 DB에 반영하기modifyArticle: (id, modifyArticle, cb) => {connection.query(`UPDATE mydb.board SET TITLE = '${modifyArticle.title}', CONTENT = '${modifyArticle.content}' WHERE ID_PK = ${id};`,(err, data) => {if (err) throw err;cb(data);},);},// 글 삭제하기removeArticle: (id, cb) => {connection.query(`DELETE FROM mydb.board WHERE ID_PK = ${id}`,(err, data) => {if (err) throw err;cb(data);},);},};module.exports = boardDB;
Routes
// dbBoard.js //const express = require('express');const boardDB = require('../controllers/boardController');const router = express.Router();// 게시판 페이지 호출router.get('/', (req, res) => {boardDB.getAllArticles((data) => {const ARTICLE = data;const articleCounts = ARTICLE.length;res.render('db_board', { ARTICLE, articleCounts });});});// 글 쓰기 페이지 모드router.get('/write', (req, res) => {res.render('db_board_write');});// 데이터베이스에 글 추가router.post('/write', (req, res) => {if (req.body.title && req.body.content) {boardDB.wrtieArticle(req.body, (data) => {// affectedRows를 이용하여 DB에 잘 입력되었는지 확인if (data.affectedRows >= 1) {res.redirect('/dbBoard');} else {const err = new Error('글 쓰기 실패');err.statusCode = 500;throw err;}});} else {const err = new Error('글 제목이나 내용이 없습니다.');err.statusCode = 400;throw err;}});// 글 수정 모드로 이동router.get('/modify/:id', (req, res) => {boardDB.getArticle(req.params.id, (data) => {if (data.length > 0) {res.render('db_board_modify', { selectedArticle: data[0] });} else {const err = new Error('해당 ID 값을 가지는 게시글이 없습니다.');err.statusCode = 500;throw err;}});});// 글 수정하기router.post('/modify/:id', (req, res) => {if (req.body.title && req.body.content) {boardDB.modifyArticle(req.params.id, req.body, (data) => {if (data.affectedRows >= 1) {res.redirect('/dbBoard');} else {const err = new Error('글 수정 실패');err.statusCode = 500;throw err;}});} else {const err = new Error('글 제목이나 내용이 없습니다.');err.statusCode = 400;throw err;}});// 글 삭제하기router.delete('/delete/:id', (req, res) => {boardDB.removeArticle(req.params.id, (data) => {if (data.affectedRows >= 1) {res.status(200).send('삭제 성공');} else {const err = new Error('삭제 실패');err.statusCode = 500;throw err;}});});router.get('/getAll', (req, res) => {boardDB.getAllArticles((data) => {res.send(data);});});module.exports = router;