비밀번호 변경
template에 추가
a(href="change-password")
상대 경로가아닌 절대 경로로 입력하면 localhost:4000/users/edit 에서 말단 부분만 바뀜
localhost:4000/users/change-password로
changePassword form 을 만들었는데
깃허브계정으로 가입한경우에는 비밀번호가 없어서 사용 할 수 없게 해야함
1.해당 페이지에 오면 리다이렉트
export const getChangePassword = (req,res)=>{
if(req.session.socialOnly === true){
return res.redirect ("/")
}
return res.render("users/change-password", {pageTitle: "Change Password"})
}
2.소셜로 로그인한 사람은 아예 해당 문구,링크가 안보이게
if !loggedIn.socialOnly
hr
a(href="change-password") Change Password →
비밀번호 변경하기
User.js에
userSchema.pre("save", async function(){
this.password = await bcrypt.hash(this.password, 5);
}); 이것으로
새로운 비밀번호를 hash 하려면
user.save()
export const postChangePassword =async (req,res)=>{
const{
session: {
user: { _id },
},
body: { oldPWD, newPWD, newPWDconfirmation },
}=req;
const user = await User.findById(_id);
const ok = await bcrypt.compare(oldPWD, user.password);
if(!ok){
return res.status(400).render("users/change-password", {
pageTitle: "Change Password",
errorMessage:"The current password is incorrect"
});
}
if(newPWD !==newPWDconfirmation){
return res.status(400).render("users/change-password", {
pageTitle: "Change Password",
errorMessage:"The password does not match the confirmation"
});
}
user.password = newPWD ;
await user.save(); //user.save() 해야 저장 전에 비밀번호 hash기능 사용 할 수있음 user.pre("save",function)
return res.redirect("/users/logout"); //비밀번호 하여 로그아웃시키기
파일올리기
edit Profile
pug에 추가
label(for="avatar") Avatar
input(type="file" id="avatar" name="avatar" accept="image/*")
서버에 파일을 저장하고 그 이미지에대한 정보 얻기
middleware multer 다운
npm i multer
NOTE: Multer will not process any form which is not multipart (multipart/form-data).
Don't forget the enctype="multipart/form-data" in your form.
form(method="POST" , enctype="multpart/form-data") 파일을 백엔드로 보내기위한 encoding type 을 바꾼거임
+ https://www.npmjs.com/package/multer
enctype ="multipart/form-data" 에 관해서 궁금해서 몇가지 정리한 글을 소개합니다.
https://kasterra.github.io/what-is-multipart-form-data/
공식문서를 보면 미들웨어 생성 해야 함
export const uploadFiles = multer({ dest:"uploads/" }) //사용자가 보낸 파일을 uploads폴더로 보내기
uploads 폴더생성
router에 post에 적용 할 거임
미들웨어 컨트롤러
userRouter.route("/edit").all(protectorMiddleware).get( getEdit).post(uploadFiles.single("avatar"),postEdit);
사용자가 /edit으로 form을 보내면 uploadFiles라는 middleware를 거쳐서 /uploads에 파일을 저장하고 req object에 req.file를 추가한 후 postEdit컨트롤러 사용
uploadfiles.single: 한 개의 파일만 올린다는 옵션
("avatar"): input name="avatar"에서 가져옴
위에 빨간 글씨는 req.flie을 추가해줌
어떻게 생겼는지 보기위해fie 변수만들어주고 cosnole.log(file)
//{
fieldname: 'avatar',
originalname: 'f35d665a9feef.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'uploads/',
filename: '15e62045afc74ffa241fc723327c83f3',
path: 'uploads/15e62045afc74ffa241fc723327c83f3',
size: 1579860
}
export const postEdit= async (req, res)=>{
const{
session: {
user: { _id, avatarUrl },
},
body: { name, email, username, location},
file, //file:{path} 사용 X, file이 존재하지 않으면 avatarUrl: file.path사용 할 수 없다.
}=req;
console.log(file);
const updatedUser= await User.findByIdAndUpdate(
_id,
{
avatarUrl: file ? file.path : avatarUrl, // avatarUrl:file만 하면 아무것도 업로드하지 않을 때인 undifined를 저장하게됨 input에 올린게 있으면 그것을 사용하고 없으면 session의 avatarUrl
name,
email,
username,
location,
},
{ new: true }
);
+gitignore에 /uploads추가
db에절대절대 파일 저장 xxxx //db는 파일 저장을 위한게 아님 폴더에 이미지 저장해
db에는 파일 위치저장 url
db는 엑셀 시트같은 것
뭐든지 다 쌓아놓는 곳은 하드, 혹은 웹하드, AWS에서는 S3에 해당하는 것이고 데이터베이스는 문자, 테이블, 시트로 표현할 수 있는 것이라고 합니다.
따라서 데이터베이스 자체에는 이미지를 저장할 수 없기 때문에 경로만 저장해두며 해당 경로에 있는 이미지를 별도로 찾게 되는 것으로 이해했습니다.
+pug
img(src="/" + loggedInUser.avatarUrl , width="100", height="100")
위처럼 /안해주면 상대주소로 저장됨
새탭으로 이미지 열었을 때
http://localhost:4000/uploads/75fe47d8631f14e2af3e27be126ae240
위와 같은 주소를 얻게되고
route에 지정하지 않아서 페이지를 불러 올 수없음
r게다가 브라우저가uploads폴더 안에 파일에 접근해야해
어디로 가야되는지 알려줘야함
브라우저가 어떤 페이지와 폴더를 볼 수있는지 알려줘야해
staticfiles serving 폴더 전체를 브라우저에 노출 시킨다는 의미
server.js
app.use("/uploads", express.static("uploads"));
//업로드 주소로가면 uploads파일에 있는 폴더 접근 허용
-->사진은 나오지만 사진 업데이트 할 때 마다 기존 사진들이 /uploads파일에 저장 됨
첫 번째 문제, 우리가 파일을 서버에 저장함
서버를 종료하고 키면 그 전 서버에 있던 파일들은 삭제 됨
--> 파일을 서버에 저장하지 않고 다른 방법
서버가 사라졌다 다시돌아와도 파일은 그대로있도록 -->배포할 때 해보겠음
When log in with GitHub for the first time, the image will not be output because of the different image path.So it was solved like this.
-if(loggedInUser.avatarUrl.startsWith("upload"))
img(src="/" + loggedInUser.avatarUrl,height="100",width="100")
-if(loggedInUser.avatarUrl.startsWith("http"))
img(src=loggedInUser.avatarUrl,height="100",width="100")
'코딩 > Today I Learn' 카테고리의 다른 글
12.22공부 프론트엔드 시작 (0) | 2021.12.22 |
---|---|
12.21 공부 (0) | 2021.12.22 |
12.15 공부 (0) | 2021.12.15 |
12.9 공부 (0) | 2021.12.14 |
12.8 공부 (3) | 2021.12.08 |