MVC - Sequelize 및 CLI 도구 이용

EBinY·2021년 12월 23일
0
  • controller 작성
const { url: URLModel } = require('../../models');
const { getUrlTitle, isValidUrl } = require('../../modules/utils.js');

module.exports = {
  
    // urls table 전체 레코드 목록을 json으로 전송
    //1. url model을 require
    //2. 특정 메소드를 이용해서 전체 목록 조회
    //3. 조회가 끝난 후(async-await, promise-then) json으로 전송
    get: async (req, res) => {
        const urls = await URLModel.findAll();
        return res.status(200).json(urls);
    },

    // post 요청에서 받은 바디에 담긴 url을 데이터베이스에 저장
    //0. url 타이틀 값을 얻어와야 함(utils.js)
    //1. 일단 데이터베이스에 있는지 확인
    //2. 없으면 생성 -> created 했다는 정보 클라이언트 응답 발송
    //3. 있으면 그대로 -> find 했다는 정보를 클라이언트 응답 발송
    post: async (req, res) => {
    // 받아온 url을 저장
        const postUrl = req.body.url;
        // url이 유효하지 않은 경우
        if (!isValidUrl(postUrl)) {
            return res.status(400).send('bad request');
        }
        // 유효한 경우
        getUrlTitle(postUrl, async (err, postTitle) => {
            if (err) {
                return res.status(404).send('Title not valid');
            }
            else {
                const [postModel, created] = await URLModel.findOrCreate({
                    where: { url: postUrl },
                    defaults: { title: postTitle },
                })
                if (created) {
                    return res.status(201).json(postModel);
                }
                // postModel을 결과로 전송
                return res.status(201).json(postModel);
            }
        })
    },
  
    //1. params 가져오기
    //2. id로 url 조회
    //3. visits field 값 +1 추가
    //4. 해당 url로 리다이렉트
    redirect: (req, res) => {
        URLModel
            .findOne({
                where: {
                    id: req.params.id
                }
            })
            .then(result => {
                if (result) {
                    return result.update({
                        visits: result.visits + 1
                    });
                } else {
                    res.sendStatus(204);
                }
            })
            .then(result => {
                res.redirect(result.url);
            })
            .catch(error => {
                console.log(error);
                res.sendStatus(500);
            });
    },
};
  • migration, models의 초기값(defaultValue)을 스켈레톤에 추가해줘야 한다
// migration
visits: {
  type: Sequelize.INTEGER,
  defaultValue: 0
},
// models의 class 내의 설정값에
url.init({
  url: DataTypes.STRING,
  title: DataTypes.STRING,
  visits: {
    type: DataTypes.INTEGER,
    defaultValue: 0
  }
},

0개의 댓글