Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Día de Ruru

20230308 TIL 본문

항해99/TIL

20230308 TIL

공대루루 2023. 3. 8. 23:10

문제점

게시글 목록 조회를 위해 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
Comments