(처음) 게시물 검색 결과를 보여줄때 생각한 정렬 방식
1. 최신에 게시된 게시물 순서대로 정렬
2. 만약에 완전히 같은 시간에 게시된 게시물을  PK id 값을 이용하여 정렬

 

하지만!!

 

Auto-increment 설정으로 값이 메겨진 pk id 를 이용하여 정렬을 하는 것을 선호하지는 않는다

(이유)

  1. PK 값은 기록된 데이터를 고유하게 식별하고 편리하게 찾기위한 값이다.
  2. 항상 순차적으로 증가를 안할 수도 있다.
  3. 다양한 요인에 의해 영향을 받는다 - 대표적으로 삭제 기능
  4. 숫자가 아닌 문자로 저장이 되기 때문에 쉽지 않다.
  5. 복잡한 쿼리나 대용량 데이터를 처리할 때 잘못된 정렬을 할 수 있다.

 

 

에러 발생

  • 이메일 주소를 입력하는데 입력이 안되는 상황
    • 입력 : testpass@email.com
    • curl -X 'GET' \ 'http://localhost:3000/posts/user-email/{email} \ -H 'accept: application/json'
    • 이유
      • swagger 작성시 name에 email 이 아닌 다른 단어를 입력하여서 입력된 이메일 주소를 인식 못함
        • name : user-email -> name: email
  • 결과에는 문제는 없지만 이메일 주소를 입력하였는데 @ 가 다르게 변경되어서 입력되는 상황
    • 입력 : testpass@email.com
    • curl -X 'GET' \ 'http://localhost:3000/posts/user-email/testpass%40email.com' \ -H 'accept: application/json'
    • 이유
      • 자동으로 컴파일을 하는 기능이 있는 듯 하다.
      • 콘솔에서 읽을 때는 문제가 없이 @ 을 인식

 

 

null

  • 위의 그림 처럼 DB 에 null 부분을 표현 하고자 nullable: true 를 했지만 원하는 형태로 표현이 안됨
    • startDate  부분에 null 을 입력해 주는 걸 기대 -> date-time 형식으로 출력
    • 해결
      • startDate 등 에 대한 값 설정에서 "example : null" 을 추가하면 null 로 표시 가능
      • 하지만 값이 있어야 하는 경우에는 example 을 삭제하고 date-time 형식으로 나오게 할 것

 

 

Locker  상태 종류

  • 사용중(occupied)
  • 비어있음(unoccupied)
  • 점검중(under maintenance)
  • 내 보관함(my locker)

상태별 상황

  • 사용중(occupied) 
    • 유저가 locker 사용을 시작
    • 이미 다른 유저가 사용중
  • 비어있음(unoccupied)
    • 유저가 locker의 사용을 끝내고 정산도 완료
    • 초기 디폴트 값
  • 점검중(under maintenance)
    • 새로운 api
    • 관리지 권한이 필요
  • 내 보관함(my locker) -> 함수를 만들어서 구현
    • 유저가 한 역에서 locker를 빌리기 전에 두가지 조건을 확인하여 만족하면 표시
      1. 사용 중인 locker
      2. 그 중 유저의 아이디와 일치

 

Station 라우터에서 API별로 추가 해야할 사항들

router.get('/:id', ...) // 선택한 역에 대한 정보 검색
  • 유저확인
  • 유저가 사용하고 있는 사물함 있으면 '내 보관함(my locker)' 으로 변경하여 응답

 

locker 라우터에서 API별로 추가 해야할 사항들

router.get('/', ...) // 모든 사물함 검색
  • 없음
router.get('/:id', ... )
  • 없음
router.patch('/use', ....) // 사용자가 이미 역을 선택했고, 사용할 사물함을 고른다.
  • 유저 확인
  • 사물함 선택시 사용 중으로  상태 변경 전환
  • 이미 유저가 사용중인 사물함을 선택하면 예외처리
router.patch('/reset',...) //사용 완료 후 정산이 되었는지 확인
  • 정산이 완료되면 비어있음으로 전환
  • 유저확인
router.patch('/maintain/:id', ...) //router.get('/:id', ...)를 변경
  • 여기서 점검중 상태로 변환
  • 관리자 권한 확인 필요

목적

  • 역의 온도와 습도를 실시간으로 제공

방법

  • openweather api 사용
  • api key 는 .env에 저장
  • 온도와 습도를 db에 저장 X
  • 특정 역을 검색할 때 api를 이용하여 검색 하여 제공

결과

  • 참고자료를 보고 구현한 결과 작동
    • 좌표는 정확하지만, OpenWeatherMap 에서 받은 동네 이름은 다른 이슈
      • 신논현역 좌표 입력 -> 동네 이름은 잠원동이라고 받음

 

참고자료

https://openweathermap.org/current

 

Current weather data - OpenWeatherMap

 

openweathermap.org

https://medium.com/javarevisited/fetching-weather-data-with-node-js-and-express-a-beginners-guide-9420e4cc2f8b

 

Fetching Weather Data with Node.js and Express: A Beginner’s Guide

A Simple Walk-through to the process of featching API data with Express and Node

medium.com

https://www.npmjs.com/package//node-fetch

 

node-fetch

A light-weight module that brings Fetch API to node.js. Latest version: 3.3.2, last published: 5 months ago. Start using node-fetch in your project by running `npm i node-fetch`. There are 33560 other projects in the npm registry using node-fetch.

www.npmjs.com

https://www.npmjs.com/package/openweather-apis?activeTab=code

 

openweather-apis

Simple APIs to use with OpenWeatherMap.org free servicies, request a APPID on http://openweathermap.org/appid and start!. Latest version: 4.5.0, last published: 7 months ago. Start using openweather-apis in your project by running `npm i openweather-apis`.

www.npmjs.com

 

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

 

+ Recent posts