지지난 게시물에 승부차기 게임에 기능 수정이 필요한 이유에 대해 말을 했었다.
우선 목적은 하루 20회 제한, 자정 초기화가 목적이다.
20회 제한과 자정 초기화를 하기 위해서 커뮤니티에 도움을 요청했었다.
지난 개인프로젝트에서는 자정초기화를 하는 것에 실패를 했었기 때문이다.
추천 받은 방법의 중요한 포인트는 초기화를 한 번에 진행하지 마라 였다.
count 변수를 하나 만들고, 게임을 할 때마다 날짜를 기록 후 데이터베이스에 전송시킨다.
로그인을 새로 했을 시에 오늘 날짜가 위의 날짜와 다르다면 횟수 20회를 초기화.
같다면 유지.
이 틀을 유지한 상태로 코드를 짜보았다.
<div class="gamezone-extrachance-area">
<div class="gamezone-extrachance-text">남은 기회</div>
<div id="gamezone-extrachance" class="gamezone-extrachance">
<%=유저.shooting_count%>
</div>
</div>
남은 기회를 나타내는 코드를 짜주었고,
var userShootingCountElement = document.getElementById('gamezone-extrachance');
var userShootingCount = parseInt(userShootingCountElement.textContent);
해당 id 값의 수인 문자열을 정수열로 변환시켜서 userShootingCount 변수에 저장.
'막힘' 을 alert 로 나타낸 이후에
userShootingCount -= 1;
userShootingCountElement.textContent = userShootingCount;
fetch('/gamezone-shooting-extrachance', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ userShootingCount: userShootingCount })
})
.then(response => response.json())
.then(data => {
})
.catch(error => console.error('Error checking extrachance:', error));
userShootingCount 를 1 감소시키고 변수에 덮어쓰기.
이후 post 방식으로 서버로 전송시킨다.
app.post('/gamezone-shooting-extrachance', async (req, res) => {
let username = req.user.username;
let userShootingCount = req.body.userShootingCount;
await db.collection('user').updateOne(
{ username: username },
{ $set: { shooting_count: userShootingCount } }
);
});
서버에서는 받은 userShootingCount 를 받고 이를 컬렉션의 해당 username 이 username 과 일치한 데이터를 찾아서 접근해 shooting_count 의 값을 업데이트 시켜준다.
passport.deserializeUser(async (user, done) => {
try {
let result = await db.collection('user').findOne({ _id: new ObjectId(user.id) });
if (result) {
delete result.password;
let today = new Date().toLocaleDateString('ko-KR', { timeZone });
let recentLogin = result.recent_login;
if (recentLogin != today.getDate()) {
await db.collection('user').updateOne(
{ _id: new ObjectId(user.id) },
{ $set: { shooting_count: 20 } }
);
}
await db.collection('user').updateOne(
{ _id: new ObjectId(user.id) },
{ $set: { recent_login: today.getDate() } }
);
}
또 로그인 했을 때 오늘 날짜와 이전에 날짜와 같다면 shooting_count 를 20 으로 초기화 시키고,
recent_login 인 최근 로그인 날짜를 업데이트 해준다.
'Project > 축구모임 홈페이지개발' 카테고리의 다른 글
[축구모임 홈페이지개발] 03/27 개발일지 Nodejs / 승부차기 게임 구현 3 (불리언 타입 함수) (0) | 2024.03.28 |
---|---|
[축구모임 홈페이지개발] 03/26 개발일지 Nodejs / 승부차기 게임 구현2 (0) | 2024.03.26 |
[축구모임 홈페이지개발] 03/23 개발일지 Nodejs / 게시물 댓글 개수 표시 (0) | 2024.03.23 |
[축구모임 홈페이지개발] 03/18 출시 이후 점검 (0) | 2024.03.18 |
[축구모임 홈페이지개발] 02/27 개발일지 Nodejs / 사이트 확대 제어 meta tag (1) | 2024.02.27 |