[middleware.js]
res.locals.loggedInUser = req.session.user || {};
[edit-profile.pug]
extends base
block content
form(method="POST")
input(name="name", type="text", required, placeholder="Name", value=loggedInUser.name)
input(name="email", type="text", required, placeholder="Email", value=loggedInUser.email)
input(name="username", type="text", required, placeholder="Username", value=loggedInUser.username)
input(name="location", type="text", required, placeholder="Location", value=loggedInUser.location)
input(type="submit", value="Update Profile")
로그인안된상태에서 >> edit profile버튼없이 주소에 쳐서 들어올경우 에러남 >> route보고할 middelware필요함 >>
export const protectorMiddleware = (req, res, next) => {
if (req.session.loggedIn) {
next();
} else {
return res.redirect("/");
}
};
export const publicOnlyMiddleware = (req, res, next) => {
if (!req.session.loggedIn) {
next();
} else {
return res.redirect("/");
}
};
import { protectorMiddleware, publicOnlyMiddleware } from "../middlewares";
const userRouter = express.Router();
userRouter.get("/logout", protectorMiddleware, logout);
userRouter.route("/edit").all(protectorMiddleware).get(getEdit).post(postEdit);
userRouter.get("/github/start", publicOnlyMiddleware, startGithubLogin);
userRouter.get("/github/finish", publicOnlyMiddleware, finishGithubLogin);
export const postEdit = async (req, res) => {
const {
session: {
user: { _id },
},
body: { name, email, username, location }, <<
} = req;
await User.findByIdAndUpdate(_id, { << << <<
name,
email,
username,
location,
});
return res.render("edit-profile");
};
req.session.user = {
...req.session.user,
name,
email,
username,
location,
};
const updatedUser = await User.findByIdAndUpdate( <<
_id,
{
name,
email,
username,
location,
},
{ new: true } << << <<
);
req.session.user = updatedUser; << <<
if (email !== req.session.user.email) {
const exists = await User.exists({ email });
if (exists) {
return res.render("edit-profile", {
errorMessage: "이미 존재하는 이메일입니다.",
});
}
}
export const getChangePassword = (req, res) => {
if (req.session.user.socialOnly === true) {
return res.redirect("/");
}
return res.render("users/change-password", { pageTitle: "Change Password" });
};
if !loggedInUser.socialOnly
hr
a(href="change-password") Change Password →
export const postChangePassword = async (req, res) => {
const {
session: {
user: { _id, password },
},
body: { oldPassword, newPassword, newPasswordConfirmation },
} = req;
if (newPassword !== newPasswordConfirmation) {
return res.status(400).render("users/change-password", {
pageTitle: "Change Password",
errorMessage: "비밀번호가 일치하지 않습니다.",
});
}
//send noti
return res.redirect("/");
};
const ok = await bcrypt.compare(oldPassword, password);
if (!ok) {
return res.status(400).render("users/change-password", {
pageTitle: "Change Password",
errorMessage: "기존 비밀번호가 틀렸습니다.",
});
}
const user = await User.findById(_id);
user.password = newPassword;
await user.save();
//send noti
return res.redirect("/users/logout");
};
ch8.10 profile, video owner, user'svideo, bugfix (0) | 2022.08.29 |
---|---|
ch8. uploads, static files , video upload (0) | 2022.08.27 |
ch7.16~ github Login & Logout (0) | 2022.08.25 |
ch7.12~ mongostore, uninitialized sessions, expiration&secret, env Var (0) | 2022.08.24 |
ch7.5~ login, sessions&cookies, logged in user (0) | 2022.08.23 |
댓글 영역