Día de Ruru
20230308 TIL 본문
문제점
게시글 목록 조회를 위해 Posts테이블에서 findAll() 로 요소들을 찾으려고 했는데 nickname이 Users 테이블에 있어서 Posts 테이블에서는 바로 불러올 수 없었다.
해결방안
model을 설정할 때 Posts 테이블과 Users 테이블을 참조키를 사용해서 부모자식 관계로 만들었던 것을 이용하면 될것같다!! Users 테이블이 부모 테이블이고 Posts 테이블이 Users 테이블의 promarykey인 UserId를 참조키로 갖고 있기 때문에 include를 사용해서 가져올 수 있다.
const posts = await Posts.findAll({
attributes: ['postId', 'UserId', "title", "createdAt", "updatedAt"],
order: [['createdAt', 'DESC']],
include: [{
model: Users,
attributes: ['nickname'],
required: false //left outer join =>true 일때는 inner join
}]
})
이런식으로 사용하면 posts라는 변수 안에 Posts에서 불러온 'postId', 'UserId', "title", "createdAt", "updatedAt" 값과 Users에서 불러온 "nickname" 값이 함께 담기게 된다. 하지만 이 때 Users에서 불러온 값들이 객체 형태로 담기게되서 내가 원하는 형태로 바꿔줘야 했다...
const Postlist = posts.map(post => {
return {
postId: post.postId,
UserId: post.UserId,
nickname: post.User.nickname, // get the "name" property of the associated user
title: post.title,
createdAt: post.createdAt,
updatedAt: post.updatedAt
};
});
이런 식으로 map()을 사용해서 다시 정렬을 해줬는데 이것보다 더 좋은 방법이 있는지 더 공부해봐야 할 것 같다!!
알게된 것
여기저기 물어보고 다닌 결과 map()을 사용하지 않고 attribute 내에서 해결하는 방법을 찾았다!!
const posts = await Posts.findAll({
raw:true,
attributes: ['postId', 'UserId',"User.nickname", "title", "createdAt", "updatedAt"],
order: [['createdAt', 'DESC']],
include: [{
model: Users,
attributes: [],
}]
})
include 안의 attribute에서 아무것도 불러오지 않고 join을 하면 바깥쪽에서의 attribute에서 참조형식으로 불러올 수 있다. raw:true를 설정하는 것은 Posts 변수가 후속 모델 인스턴스 대신 일반 자바스크립트 객체의 배열이 된다는 것을 의미한다.
☆오늘 공부한 것★
에러핸들링 미들웨어
프로그램에서 생기는 에러는 잘못된 req로 인한 에러일 수도 있고 예상치 못한 에러일 수도 있다. 우리가 예상할 수 있는 에러는 코드 내에서 에러핸들링을 통해 에러가 발생했을 때 프로그램이 정지되는 것을 막고 어떤 동작을 해줄 지 정할 수있다.
처음 공부를 시작했을 때는 모든 에러를 하나하나 status를 지정해주고 reponse를 해주었었다. 하지만 에러핸들링 미들웨러를 사용하면 조금 더 편하게 에러를 핸들링 할 수 있다.
에러 핸들링 미들웨어의 에러처리를 위한 매개변수는 총 4개이며 err, req, res, next 이다. 아래와 같이 작성할 수 있다.
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('internal server error');
})
해당 미들웨어는 항상 미들웨어들의 가장 마지막에 작성해야 한다. 그렇게 해야 어떤 지점에서 에러가 발생하더라도 에러가 생긴 시점에서 next(err)로 에러를 던저줬을 때 최종적으로 에러 핸들링 미들웨어가 받을 수 있다.
app.get('*', function(req, res, next) {
var error = new Error('My Error occurred');
error.status = 500;
next(error);
});
위와 같이 사용하면 에러가 발생했을 때 next(err) 로 인해 바로 에러핸들링 미들웨어로 err 안에 들어있는 에러 데이터를 보내준다.
기본개념은 이제 알겠는데 어떻게 사용해야 더 효율적으로 사용할 수 있을지 잘 모르겠다... 계속 사용해보다보면 뭔가 감이 오지않을까 하는 생각에 이렇게도 사용해보고 저렇게도 사용해보고 있다...!! 화이팅!!!
'항해99 > TIL' 카테고리의 다른 글
20230318 TIL (0) | 2023.03.19 |
---|---|
20230309 TIL (0) | 2023.03.09 |
20230307 TIL (0) | 2023.03.08 |
20230306 TIL (0) | 2023.03.07 |
20230304 TIL (Node.js 기초 공부 day4) (0) | 2023.03.05 |