Web
[Backend] Node.js + Express MVC 기초 세팅
ㅋ. ㅋ
2024. 1. 2. 14:39
.
├── README.md
├── node_modules
├── package-lock.json
├── package.json
├── src
│ ├── app.js
│ ├── controllers
│ │ └── index.js
│ ├── routes
│ │ └── index.js
│ └── views
│ ├── error.ejs
│ └── index.ejs
└── yarn.lock
폴더구조
// app.js
const express = require("express");
const logger = require("morgan");
const cors = require("cors");
const path = require("path");
const createError = require("http-errors");
const app = express();
app.use(
cors({
origin: ["http://localhost:3000", "~~~"], // port 3000 뚫음
credentials: true,
})
);
/** view 설정 */
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
/** 로그 */
console.log(process.env.NODE_ENV);
if (process.env.NODE_ENV === "production") {
app.use(logger("combined"));
} else {
app.use(logger("dev"));
}
/** 미설정 시 req.body undefined 뜸 */
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
/** 주소 - 라우터 파일 매칭 */
const apiRouter = require("./routes/index.js");
app.use("/api/", apiRouter);
/** error 처리 */
app.use(function (req, res, next) {
next(createError(404));
});
app.use(function (err, req, res) {
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
res.status(err.status || 500);
res.send("error");
});
/** server 구동 */
const server = app.listen(3001, () => {
const serverPort = server.address().port;
console.log("server started, port : ", serverPort);
});
module.exports = app;
// routes/index.js
const express = require("express");
const router = express.Router();
const { postData, getData } = require("../controllers/index");
module.exports = router;
/** ex path : http://localhost:3001/api/~ */
/** post - http://localhost:3001/api/ */
router.post("/", async function (req, res) {
await postData (req) // business logic은 컨트롤러에서 처리
.then((res) => {
return res.status(200).send({ data: res });
})
.catch((err) => res.status(500).send(err));
});
/** get - http://localhost:3001/api/get */
router.get("/get", async (req, res) => {
await getData (req) // business logic은 컨트롤러에서 처리
.then((res) => {
return res.status(200).send({ data: res });
})
.catch((err) => res.status(500).send(err));
});
// views/error.ejs
<h1>
<%= error %>
</h1>
// views/index.ejs
<!DOCTYPE html>
<html>
<head>
<title>
<%= title %>
</title>
<link rel='stylesheet' href='../stylesheets/style.css' />
</head>
<body>
<h1>
<%= title %>
</h1>
</body>
</html>
view는 뭔지는 잘 모르겠는데 아마 브라우저에 주소 치면 뜨는 창 아닐까?
// package.json -> scripts
"start": "env-cmd -f ./.env.local cross-env APP_ENV=local node ./src/app.js"
"dev": "env-cmd -f ./.env.development cross-env APP_ENV=development next dev",
env-cmd 랑 croess-env 설치하고 .env 파일도 만들기
nodemon -> 서버 내용 변경/저장 시 서버 재부팅 없이 반영 바로 해줌