다른 사용자가 남기 글을 삭제하기 못하게 구현하다 발생한 이슈
// 게시글 삭제
router.delete('/post/:postId', authMiddleware, async (req, res) => {
const {postId} = req.params
try {
const post = await Post.findById(postId)
if(!post.writer.equals(res.locals.user._id)) return res.status(400).json({message : '다른 사용자의 게시글은 삭제할 수 없습니다.'})
if(post) {
await Post.deleteOne({_id : postId})
return res.status(200).json({message : '게시글을 삭제하였습니다.'})
}
} catch (err) {
return res.status(500).json({message : err})
}
})
post.writer !== res.locals.user._id 일 때, 삭제할 수 없다는 메세지를 보내려는 상황
콘솔 창에 두 정보를 비교해보면 값은 완전히 일치한다.
두 값이 같아 보이나 다른 경우이다.
mongodb의 유니크한 _id는 ObjectId('63c2a444d12cda2df3b9d190')
데이터타입이 원시타입이기 때문이다.
변수에 값을 할당하게 되면 메모리 셀에 값이 들어가게 되고, 변수는 값이 들어있는 메모리셀의 주소를 가리키게 된다.
서로 다른 메모리셀의 주소를 가리키고 있기 때문에 if조건문 상에서 일치하지 않는다는 결과를 보여준다.
db에 유니크한 _id를 value값으로 저장하려했을 때, string타입으로 저장되었다.
const { ObjectId } = require('mongoose').Types
// 채팅방 정보 저장
router.post('/chatroom', authMiddleware, async (req, res) => {
const {writer} = req.body
const data = { member : [ObjectId(writer), res.locals.user._id], title : '무슨무슨채팅방' }
try {
await Chatroom.create(data)
res.status(200).json({message : '채팅방에 정보를 보냈습니다.'})
} catch (err) {
return res.status(500).json({message : err})
}
})
상단에 객체 구조 분해 할당으로 값을 가져왔다.
value에 ObjectId() 함수를 감쌌다.
차이를 몰라 몇시간 동안 고생하였다.
// 채팅방 정보 불러오기
function reloadChat() {
$.ajax({
type : 'GET',
url : '/api/chatroom',
data : {},
success : function (response) {
let chatroomData = response['chatroomData']
$('#chatroom').empty()
for(let i = 0; i < chatroomData.length; i++) {
let chatroomId = chatroomData[i]['chatroomId']
let user1 = chatroomData[i]['member'][0]
let user2 = chatroomData[i]['member'][1]
let title = chatroomData[i]['title']
let template = `<li class="list-group-item chatroom" data-id="${chatroomId}">
<h6 style="font-weight : bold;">${title}</h6>
<h6 style="font-size: 12px;">${user1}에게 ${user2}가 채팅을 요청하였습니다.</h6>
</li>`
$('#chatroom').append(template)
}
},
error : function (response) {
alert(response.responseJSON.message)
window.location.reload()
}
})
}
// 메세지 발행
let targetChatroomId
function getChatroomId(e) {
targetChatroomId = e.currentTarget.dataset.id
console.log(targetChatroomId)
}
li태그의 부분만 클릭 했을 시, _id값이 변수에 저장되는 상황
li태그 전체에 onclick을 하였지만
자식태그인 h6이 눌러지면 undefined가 되는 상황
e.target = e.currentTarget으로 변경
event.target은 부모로부터 이벤트가 위임되어 발생하는 자식의 위치, 내가 클릭한 자식 요소를 반환
currentTarget은 이벤트가 부착된 부모의 위치를 반환한다.