https://github.com/loy124/express-mongodb-template
마무리
server.js에 /logout 라우터를 만들어준다.
server.js
const express = require("express");
const app = express();
const port = 9000;
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const mongoose = require("mongoose");
const { User } = require("./models/User");
const { auth } = require("./middleware/auth");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
//이곳에 mongodb 사이트에서 카피한 주소를 이곳에 넣으면 된다.
const dbAddress =
"mongodb+srv://root:root@cluster0-f3nrh.mongodb.net/<dbname>?retryWrites=true&w=majority";
mongoose
.connect(dbAddress, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false,
})
.then(() => console.log("MongoDB Connected"))
.catch((err) => console.log(err));
app.get("/", (req, res) => res.send("Hello world!!!!"));
app.post("/register", (req, res) => {
//회원가입을 할때 필요한것
//post로 넘어온 데이터를 받아서 DB에 저장해준다
const user = new User(req.body);
user.save((err, userInfo) => {
if (err) return res.json({ success: false, err });
return res.status(200).json({ success: true });
});
});
app.post("/login", (req, res) => {
//로그인을할때 아이디와 비밀번호를 받는다
User.findOne({ email: req.body.email }, (err, user) => {
if (err) {
return res.json({
loginSuccess: false,
message: "존재하지 않는 아이디입니다.",
});
}
user
.comparePassword(req.body.password)
.then((isMatch) => {
if (!isMatch) {
return res.json({
loginSuccess: false,
message: "비밀번호가 일치하지 않습니다",
});
}
//비밀번호가 일치하면 토큰을 생성한다
//해야될것: jwt 토큰 생성하는 메소드 작성
user
.generateToken()
.then((user) => {
res.cookie("x_auth", user.token).status(200).json({
loginSuccess: true,
userId: user._id,
});
})
.catch((err) => {
res.status(400).send(err);
});
})
.catch((err) => res.json({ loginSuccess: false, err }));
});
});
//auth 미들웨어를 가져온다
//auth 미들웨어에서 필요한것 : Token을 찾아서 검증하기
app.get("/auth", auth, (req, res) => {
//auth 미들웨어를 통과한 상태 이므로
//req.user에 user값을 넣어줬으므로
res.status(200).json({
_id: req._id,
isAdmin: req.user.role === 09 ? false : true,
isAuth: true,
email: req.user.email,
name: req.user.name,
lastname: req.user.lastname,
role: req.user.role,
image: req.user.image,
});
});
//user_id를 찾아서(auth를 통해 user의 정보에 들어있다) db에있는 토큰값을 비워준다
app.get("/logout", auth, (req, res) => {
User.findOneAndUpdate({ _id: req.user._id }, { token: "" }, (err, user) => {
if (err) return res.json({ success: false, err });
res.clearCookie("x_auth");
return res.status(200).send({
success: true,
});
});
});
app.listen(port, () => console.log(`listening on port ${port}`));
findOneAndUpdate를 사용해서 id값을 요청으로 받아와서 token의 내용을 비워주는 로직이다
토큰을 비워줌과동시에 cookie또한 삭제해준다.
auth 미들웨어를 구현해둠으로써 logout은 손쉽게 처리가 되었다.
이로써 기초 express, mongodb 를 활용한 회원가입및 로그인, 로그아웃 구현이 완료되었다.
+ 추가적으로 cors를 적용해줘야한다
cors 적용을 해주지 않으면 정상적으로 프론트서버단에서 백엔드 서버 단에 요청을 보낼수 없기에 백엔드 단에서 cors를 설정해서 값을 받을 수 있게 해줘야한다.
npm i cors --save
server.js
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const mongoose = require("mongoose");
const { User } = require("./models/User");
const { auth } = require("./middleware/auth");
const cors = require("cors");
app.use(
cors({
origin: true,
credentials: true, //도메인이 다른경우 서로 쿠키등을 주고받을때 허용해준다고 한다
})
);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
해당 CORS까지 추가해주면 기본적인 백엔드 구성이 완료된다.
'Node.js > node 활용하기' 카테고리의 다른 글
node - pm2로 node.js 프로세스 관리하기 - 기본 명령어, 실행하기 (0) | 2021.07.10 |
---|---|
node multer을 활용한 파일 업로드 (0) | 2020.08.23 |
express mongodb 활용하기 - auth middleware 구현하기 (0) | 2020.06.28 |
express mongodb 활용하기 - 로그인 기능 만들기 (jwt) (5) | 2020.06.28 |
express mongodb 활용하기 - 회원가입 구현하기(bcrypt로 암호화) (5) | 2020.06.27 |