-
Express.js] 여러 정보를 한번에 export하는 라우터 만들기Node.js 2023. 12. 12. 17:40
1. 기존 : module.exports = router
// admin.js const path = require("path"); const express = require("express"); const rootDir = require("../util/path"); const router = express.Router(); // /admin/add-product <- GET router.get("/add-product", (req, res, next) => { res.sendFile(path.join(rootDir, "views", "add-product.html")); }); // /admin/add-product <- POST router.post("/add-product", (req, res, next) => { console.log(req.body); res.redirect("/"); }); module.exports = router;
//app.js 요약 const adminRoutes = require("./routes/admin"); app.use("/admin", adminRoutes);
기존 코드에서는 admin의 router 정보만 담아서 내보내기 했고,
app.js에서도 router 정보 하나만 다루었다.
그러나 하나의 모듈에서 여러 정보를 함께 내보내기 할 수 있다.
2. 변경 : exports.____ = ____
새로운 정보를 담을 배열을 하나 만들어보자.
//admin.js const products = [];
이제 라우터와 함께 프로덕트 배열을 함께 저장해서 사용할 거다.
// admin.js //module.exports = router; exports.routes = router; exports.products = products;
// app.js //const adminRoutes = require("./routes/admin"); const adminData = require("./routes/admin"); //app.use("/admin", adminRoutes); app.use("/admin", adminData.routes);
이게 require('~/admin')을 통해 불러오는 정보는 라우터 정보 뿐만 아니라
프로덕트 배열도 함께 담고 있다.
따라서 변수명을 바꿨다.
adminRoutes -> adminData
미들웨어에서도 adminRoutes를 바로 쓰는 게 아니라
adminData가 갖고 있는 routes를 지정해 사용하도록 한다.
// admin.js router.post("/add-product", (req, res, next) => { products.push({ title: req.body.title }); res.redirect("/"); });
admin.js에서 프로덕트 배열에 새로운 정보를 저장한다.
const로 선언했어도 배열은 참조타입이라 새로운 정보를 저장할 수 있다.
- push() : 배열의 마지막에 새로운 값을 추가한다.
여기서는 배열 안에 객체들을 생성해 저장한다.
title이라는 이름의 속성은
req.body.title을 통해 브라우저의 post 요청이 담고 있는 title(앞에 쓴 title과 다름)을 가져와 저장한다.
// shop.js const adminData = require("./admin"); router.get("/", (req, res, next) => { console.log(adminData.products); res.sendFile(path.join(rootDir, "views", "shop.html")); });
"/"로 연결되는 메인페이지에서
프로덕트 배열 안에 있는 값을 콘솔로 찍어보자.
만들어진 서버에 진입하면
아직 아무 정보가 없어서 빈 배열이 찍힌다.
바나나를 입력하면
새로운 객체가 생성되어 프로덕트 배열 안에 담겨 있는 걸 확인할 수 있다.
한번 더 해보자
기존 정보가 유지된 채로 새로운 과일이 배열에 추가되었다.
3. 문제점 : 사용자 간 입력데이터가 공유된다.
현재 방식의 문제는 이렇게 저장된 데이터를 다른 사용자가 제한없이 접근할 수 있다는 점이다.
현재 크롬브라우저를 쓰고 있는데
이번에는 엣지 브라우저로 같은 주소로 접속해보자.
이는 다른 사용자로서 서버에 접근하는 것으로 인식된다.
과연 콘솔창에는 빈 배열이 출력됐을까?
이전 사용자(크롬)가 입력한 값을 다른 사용자와 공유하고 있다.
개인정보처럼 공유되면 안 되는 데이터를 입력했다고 생각하면?
아찔하다.
해결해보자.
'Node.js' 카테고리의 다른 글
Pug로 HTML문서 작성하기 (0) 2023.12.18 Express.js] pug(jade)/ejs/handlebar 템플릿 설치 및 사용하기 (0) 2023.12.15 Express.js] static 폴더 사용 | 정적으로 파일 서비스 하기 | CSS, JS, 이미지 파일 등 가져오기 (0) 2023.12.12 Express.js]Navigation을 위한 헬퍼(유틸)함수 사용 (0) 2023.12.12 Express.js] HTML 페이지 서비스하기 (0) 2023.12.11