Día de Ruru
20230306 TIL 본문
문제점 (1)
게시글을 작성할 때 자동으로 현재 날짜를 업데이트 해주기 위해서 schema에서 createdAt과 updateAt의 속성을 {type : Date, default : new Date() }로 설정했다. 그런데 게시글 수정에서 수정해줄 때 updatedAt의 날짜만 수정하는게 안된다... 계속 createdAt의 날짜까지 같이 수정되는 문제가 발생했다.
해결방안
mongoose에서 사용할 수 있는 timestamp를 사용하면 ceatedAt과 updatedAt이 자동으로 생성및 반영을 해주어서 쉽게 사용할 수 있었다. 기존의 schema에서 아랫부분만 바꿔주면 된다!!
const mongoose = require("mongoose");
const postsSchema = new mongoose.Schema({
postId: {
type: Number,
required: true,
unique: true
},
... //필요한 데이터의 schema 작성
}, {
timestamps: {
createdAt: "createdAt",
updatedAt: "updatedAt"
});
위 처럼 작성해주면 createdAt이라는 key로 생성날짜가 updatedAt이라는 key로 수정 날짜가 자동으로 반영된다!!
문제점 (2)
에러핸들링을 할 때 try...catch 문을 사용하다가 throw를 사용해보고 있는데 내가 정해준 에러 외에 예상치못한 에러가 발생했을 때 어떻게 해야할지 전혀 모르겠다...
해결방안
1. try...catch문을 또 다른 try...catch 문으로 감싸야 하나? 하고 생각하고 기존의 try...catch문을 새로운 try...catch문으로 감싸서 작성해보았다. 하지만 안쪽에 있는 try 문에서 생긴 에러가 바깥쪽으로 날아가지 않는거 같다 실패
2. 에러핸들링 미들웨어를 사용할 수 있으면 좋겠지만 지금은 과제를 제출하는게 우선이기 때문에 일단 기술 매니저님과 문제를 해결해보았다. 에러핸들링 미들웨어에 대한 설명을 듣고 그것과 비슷하게 구현해보려고 했다. 물론 매니저님이 도와주심..ㅎㅎ
try{
if (userId !== existsPosts.userId) {
const error = new Error("게시글 수정의 권한이 존재하지 않습니다.");
error.expect = true;
error.status = 403
throw error;
}
}catch (err){
return res.status(err.status || 400).json({
errorMessage: err.expect ? err.message : "게시물 수정이 실패했습니다."
});
}
try문 안에서 내가 지정하고 싶은 에러사항일 때에는 error.expect를 true로 설정해두고 throw로 에러를 가장 가까운 catch문으로 날린다. catch문에서 받은 err에는 throw로 날아온 error의 내용들이 들어있다!
여기서 errorMessage: err.expect ? err.message : "게시물 수정이 실패했습니다." 이 부분은 err.expect가 true일 때는 throw로 날아온 message를 반환하고 아닐 때에는 "게시물 수정이 실패했습니다." 라는 메세지를 반환한다. 이때 내가 예상치 못했던 에러가 생기면 err.expect가 true로 설정되어 있지 않기 때문에 "게시물 수정이 실패했습니다." 라는 메세지가 반환된다!!!! 완벽하지는 않지만 꽤나 그럴듯하게 에러 핸들링이 가능해졌다 기분좋구먼 나중에 에러헨들러 미들웨어 공부해야지
알게된 점
throw 연산자는 에러를 생성해서 가장 가까운 catch 문으로 보내준다. 자바스크립트는 Error, SyntaxError, ReferenceError, TypeError등의 표준 에러 객체 관련 생성자가 있다. 이 생성자를 사용하면 에러를 생성할 수 있다.
let error = new Error(message);
let error = new SyntaxError(message);
let error = new ReferenceError(message);
이 생성자를 활용해서 throw로 에러를 만들어서 보내줄 수 있다. 아래의 경우 user.name이 없으면 SyntaxError가 생성되고 그 아래의 console.log(user.name)은 실행되지 않는다. 생성된 에러는 가장 가까운 catch문의 매개변수 e 에 할당되어서 catch문 안에서 사용할 수 있게 된다. 에러 메세지는 JSON Error: 불완전한 데이터: 이름 없음 와 같이 출력된다.
try {
if (!user.name) {
throw new SyntaxError("불완전한 데이터: 이름 없음");
}
console.log(user.name)
} catch(e) {
console.log("JSON Error: " + e.message );
}
문제점 (3)
req.body로 받아온 데이터의 상태를 확인해서 올바른 형태로 받아왔는지 확인해야 한다!!!! 그런데!!!! req.body를 객체구조분해 할당으로 받은 데이터를 이용하려고 했는데 그게 맞는건지 잘 모르겠다.
해결방안
조금 구글링을 해봤더니 body-parser라는 미들웨어를 사용하면 req.body의 값을 받아서 사용할 수 있다고 한다. 조금 더 찾아봤더니 최근 버전의 express에서는 body-parser가 내장되어 있다고 한다!!
router.post('/api/data', (req, res) => {
if (!req.body.hasOwnProperty('name')) {
res.status(400).send('Missing required field: name');
} else {
const name = req.body.name;
res.status(200).send(`Hello, ${name}!`);
}
});
위의 예시처럼 req.body.hasOwnProperty('name')을 사용해서 body가 name이라는 프로퍼티를 갖고 있는지도 확인 할 수 있고, req.body.name으로 그 값을 바로 사용할 수도 있다.
알게된 점
mongoose 용 body-parser middleware는 들어오는 HTTP 요청의 본문 부분을 추출하여 자바스크립트 객체로 노출시켜 쉽게 접근하고 조작할 수 있는 도구이다. 이 미들웨어는 JSON, URL 인코딩 데이터 및 기타 다양한 유형의 데이터를 포함하여 요청 본문에서 전송된 데이터를 구문 분석하는 데 사용된다고 한다!! 쉽게 말해 HTTP 요청을 수신하면 body-parser 미들웨어를 사용하여 요청 본문을 추출하고 작업하기 쉬운 형식으로 변환할 수 있다는 것 같다~~ 끝~~
'항해99 > TIL' 카테고리의 다른 글
20230308 TIL (0) | 2023.03.08 |
---|---|
20230307 TIL (0) | 2023.03.08 |
20230304 TIL (Node.js 기초 공부 day4) (0) | 2023.03.05 |
20230303 TIL (Node.js 기초 공부 day3) (0) | 2023.03.04 |
20230301 TIL (0) | 2023.03.01 |