verdantjuly/Today I Learned
TIL 20240106
verdantjuly
2024. 1. 6. 00:06
728x90
이번 주 목표
Chat.jsx 분석
더미데이터 쿼리 마저 짜기
오늘 목표
더미데이터 쿼리 마저 짜기
오늘 한 것
카카오톡 csv파일 기반 대화방에 들어온 지 하루 지난 사람 출력하기
더미데이터 쿼리 마저 짜기
오늘 스케줄
12:00 귀가, 점심식사
12:30 자유
13:00 영화
16:00 개발
17:00 TIL 작성
17:30 토 : 다음주 계획, 일 : WIL 작성
18:00 기술면접 공부
19:00 저녁식사
19:30 내 코드 분석
21:30 독서 (모던 자바스크립트 딥다이브)
23:30 스터디방 - 보이스룸 가능 인원 파악
23:45 다이어리 작성
24:00 취침
1. 카카오톡 csv파일 기반 대화방에 들어온 지 하루 지난 사람 출력하기
참여하고 있는 오픈채팅방에서는 하루 지난 사람만 보이스룸에 들어올 수 있는 규칙이 있다.
보이스룸 진행자 권한을 받게 되었는데 50명 이상 되는 사람을 체크하기 어려울 것 같아 만들었다.
// app.js
const express = require("express");
const csv = require("csv-parser");
const fs = require("fs");
const multer = require("multer");
const path = require("path");
const app = express();
const port = 3000;
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, __dirname);
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}_${file.originalname}`);
},
});
const upload = multer({ storage: storage });
let users = new Map();
app.post("/upload", upload.single("file"), (req, res) => {
let result = [];
try {
// 업로드된 CSV 파일 경로
const csvFilePath = req.file.path;
// CSV 파일 읽기 및 처리
fs.createReadStream(csvFilePath)
.pipe(csv(["Date", "User", "Message"]))
.on("data", (row) => {
if (row.Message.includes(`${row.User}님이 들어왔습니다.`)) {
users.set(row.User, new Date(row.Date).getTime() + 86400000);
}
if (row.Message.includes(`${row.User}님이 나갔습니다.`)) {
users.delete(row.User);
}
if (row.Message.includes(`님을 내보냈습니다.`)) {
const target = row.Message.split("님을")[0];
users.delete(target);
}
})
.on("end", () => {
users.forEach((value, key) => {
console.log(key);
if (new Date().getTime() > value) {
result.push(key);
}
});
fs.unlink(csvFilePath, (err) => {
if (err) {
console.error("Error deleting file:", err);
res.status(500).send("Error deleting file");
} else {
console.log("File deleted successfully.");
res.status(200).json({ result });
}
});
});
} catch (error) {
console.error(error);
res.status(500).send("Internal Server Error");
}
});
app.use(express.static(path.join(__dirname, "public")));
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});
// index.js
async function upload() {
const form = document.getElementById("csvFile");
const formData = new FormData();
formData.append("file", form.files[0]);
const response = await fetch("./upload", {
method: "POST",
body: formData,
});
const result = await response.json();
const tempHTML = result.result
.map((item) => {
return `<p>${item}</p>`;
})
.join("");
const list = document.getElementById("list");
list.innerHTML = tempHTML;
}
2. 더미데이터 쿼리 짜기
—더미데이터 생성
—필요한 만큼 복제하고 변경하세요.
—회원 추가
INSERT INTO Users (email, nickname, password, createdAt, updatedAt, deletedAt, kakaoId)
VALUES ("first@user.com", "firstuser","$2b$10$j2ttScQDbV17xcrnldH8BuDGhRI3WtvydDhe7oJiq6vSCy6a4Pno2", "2024-01-01 00:00:00","2024-01-01 00:00:00", null, null )
—게시글 추가
INSERT INTO Posts ( userId, title,content, img,annualCategory, createdAt, updatedAt, deletedAt, notice, thumbnail )
VALUES(1, "test", "test", "https://gthen.s3.ap-northeast-2.amazonaws.com/1704335641572_6139dd3798418a9639f846f00","1980", "2024-01-01 00:00:00", "2024-01-01 00:00:00", null, null, "https://gthen.s3.ap-northeast-2.amazonaws.com/1704335642128_6139dd3798418a9639f846f00")
—신고 추가
INSERT INTO Reports (userId, reportType, contentId, content, isReport, createdAt)
VALUES(1, "post", 1,"욕설 금지",true, "2024-01-01 00:00:00")
정리
formData append 하는 법
formData.append("file", form.files[0]);
KPT
Keep
뭐든 도전해 보는 것
Problem
복잡한 것을 싫어해서 완성도가 떨어지는 것
Try
가끔은 배포할 수 있을 정도의 프로젝트도 만들어 보기
소감
재밌었다.