Node.js , MySQL, Sequelize, Express

 

참고자료

간단한 방법

post.findAll({
  // pagination
  offset: 10,
  limit: 5
});
  • offset : 내가 검색 결과를 가져오기 전에 넘어갈 게시물의 수
  • limit : 페이지당 보여줄 게시물의 수

 

offset 을 보고 싶은 페이지에 맞춰서 설정하기

  • query 파라메터 이용 -> page, limit 을 입력
  • limit 을 입력하지 않아도 값을 받을 수 있도록 default value 설정
  • page 값을 기준으로 offset 설정
    • page = 4, limit =5 --> offset = 5*(4 -1)  : 총 15개의 게시물을 거르고 16번째부터 5개 수집
  • findAndCountAll 을 이용하여 query parameter에 있는 page 가 존재하는지 확인
router.get('/', async (req, res, next) =>{
  try{
    const page = req.query.page;
    const limit =  Number(req.query.limit) || 5;
    const offset = limit * (page - 1)

    const {count, rows} = await Post.findAndCountAll({
      order: [['id', 'DESC'], ['createdAt', 'DESC']],
      limit,
      offset,
    })

    if (rows.length === 0){
      throw new HttpException(400, "없는 페이지 입니다.");
      return;
    }

    const posts = await Post.findAll({
      order:[['id', 'DESC'], ['createdAt', 'DESC']],
      limit,
      offset,
    })
    res.status(200).send(posts);

  }catch(err){
    next(err)
  }
})

 

 

Swagger 작성시 참고 - query 가 여러개면 - in: query 여러개 작성

/posts/?limit=number&page=number:
...
parameter
  - in: query

 

  • 로그인을 하여 부여받은 jwt token은 일단 쿠키에 저장
    • 문제 : 동시에 100명이 접속해 있으면 이걸 어떻게 처리하지??
      아!! 각 유저의 브라우저에 있는 쿠키니까 상관이 없네;;

 

게시물 게시

토근이 있으면 유저의 아이디를 알 수 있으니 게시물을 누가 게시했는지 표기는 가능

토큰발급 받아서 쿠키에 저장 -> 미들웨어 authenticateToken.js 에서 쿠키 사용 

router.post('/sign-in', async (req, res, next) => {
  try {
    const { email, password } = req.body;
    await sequelize.transaction(async () => {
      // code..
      res.cookie('token', accessToken).status(200).send('로그인에 성공하였습니다.');
    });
  } catch (err) {
    next(err);
  }
});

 

//미들웨어에서
const token = req.cookies['token'];

 

<문제> 크롬에서 서드파티 쿠키를 곧 사용할 수가 없게 된다는 뉴스

 

다른 방식시도가 필요!!

 

 

지하철에 있는 보관함의 위치를 지도에서 보여주고 앱의 작은 부분 구현해보기

 

  1. 로그인/로그아웃
  2. 질문을 올릴 수 있는 게시판 -로그인 시에만 가능
  3. 질문에 댓글게시
  4. 사물함 상태 표시 (사용중, 점검중, 선택가능)
  5. 역 위치 지도에 표시 - 좌표만 전달
  6. 역 별 날씨상태표시 - weather API 이용
  7. 역 별 주소 표시

Post 는 해당 pk 로 전부 지워지는데 comment는 postId 부분만 지워진다.

 

>> 지우는 순서의 문제다!!

router.delete('/:id', async (req, res) => {
    const id = req.params.id;
    await sequelize.transaction(async ()=>{
        
        await Post.destroy({where: {id: id}}); // 1
        await Comment.destroy({where: {postId: id}}); // 2
    })
    res.status(204).send();
})

여기서 1 이 지워지면  Comment에 있는 postId가 어디를 참조 하고 있는지 몰라서 NULL로 바뀌고

2 의 코드에서 지워야할 포스트를 찾을 수가 없으므로 코멘트가 지워지지 않는다.

 

!! 각 모델에서 foreignKey가 어떤 모델과 관계가 있는 지 꼭 확인을 하고 지우는 순서를 고려해야 한다.

router.delete('/:id', async (req, res) => {
    const id = req.params.id;
    await sequelize.transaction(async ()=>{
        await Comment.destroy({where: {postId: id}}); // 1
        await Post.destroy({where: {id: id}}); // 2
        
    })
    res.status(204).send();
})
.../routers/posts.js:65
allPosts.sort(sortDateDescending);
TypeError: allPosts.sort is not a function

이유가 뭐지?? allPosts가 array가 아닌가?? -> console 로 출력 해보자

 

<시도>

const allPosts = Post.findAll();
console.log(allPosts);
console.log(Array.isArray(allPosts);

 

<결과>

// console.log(allPosts)의 출력 결과
Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 1230,
  [Symbol(trigger_async_id_symbol)]: 1222
}

// console.log(Array.isArray(allPosts))의 출력 결과
false

TypeError: allPosts.sort is not a function

 

>>  첫번째 출력은 뭔지 모르겠으나, Array 형식이 아니라고 하여 형식을 변환 후 출력

const allPosts = Post.findAll();
const allPostsArray = Array.from(allPosts)

console.log(allPostsArray);  // 출력 : []
console.log(Array.isArray(allPostsArray));// 출력: true

 

<< 코드는 정상적으로 작동하는데 받아오는 값이 없다>>

  1. Sequelize 에서 findAll 조사 : https://sequelize.org/api/v6/class/src/model.js~model#static-method-findAll.

..... 문제는 단순했다...   await 를 쓰지 않은 상태에서  array 형태로 변형 시켜서 allPosts 에 아무런 값이 담기지 않았다.

//const allPosts = Post.findAll(); 
const allPosts = await Post.findAll();
 

+ Recent posts