혼자 고민해보기_ 개발/TIL (Today I Learned)

20230628(수)_ 노드 JS 뉴스피드 팀 프로젝트 진행

nuri-story 2023. 6. 28. 21:25

금일 달성 항목

1)  노드 JS 뉴스피드 팀 프로젝트 진행 : 리뷰, 좋아요 기능 구현
2) 후발대 강의 수강: 인증 관련


문제 해결 과정 1-  좋아요 기능 구현

[문제]
좋아요 기능을 어떻게 구현해야하는지 모르는 상황이었습니다.

 

[시도]

좋아요 기능을 구현할때

1) 로그인한 사용자만 해당 맛집 게시글에 좋아요 가능

2) 해당 맛집 게시글에 좋아요는 한 번만 가능, 중복 좋아요는 불가

3) 좋아요가된 맛집 게시글에 다시 좋아요를 선택 했을 경우 좋아요가 취소되도록 구현

 

위와같은 조건을 만들고 구글링을 이것저것 해보았습니다.

 

https://heurm-tutorial.vlpt.us/12/

 

12. 좋아요 기능 구현하기 · GitBook

12. 좋아요 기능 구현하기 이번 12장에서는, 특정 포스트를 좋아요 / 좋아요 취소 하는것을 구현해보겠습니다. 포스트를 좋아요 할 때에는, Post 모델의 likesCount 값과 likes 배열을 수정하게 됩니다.

heurm-tutorial.vlpt.us

 

[해결]

likes.route.js

const express = require('express');
const router = express.Router();
const authMiddleware = require('../middlewares/auth-middleware');
const { Likes } = require('../models');
const { Users } = require('../models');
const { Places } = require('../models');


// 좋아요 확인하기
router.get('/', async (req, res) => {
  const likes = await Likes.findAll({
    attributes: ['placeId', 'likeId', 'UserId', 'createdAt', 'updatedAt'],
    include: [
      {
        model: Users,
        attributes: ['name'], //사용자 이름 연결
      },
    ],
    order: [['createdAt', 'DESC']],
  });

  return res.status(200).json({ data: likes });
});

//좋아요 만들기
router.post('/:placeId', authMiddleware, async (req, res) => {
  const { userId } = res.locals.user;
  const { placeId } = req.params;

  try {
    const existingLike = await Likes.findOne({
      where: { UserId: userId, PlaceId: +placeId },
    });

    if (existingLike) {
      await Likes.destroy({
        where: {
          UserId: userId,
          PlaceId: +placeId,
        },
      });
      res.status(200).json({
        liked: false,
      });
    } else {
      await Likes.create({
        UserId: userId,
        PlaceId: +placeId,
      });
      res.status(200).json({
        liked: true,
      });
    }
  } catch (error) {
    console.error('오류가 발생했습니다.', error);
    res.status(500).json({ message: '오류가 발생했습니다.' });
  }
});

module.exports = router;

위 처럼 좋아요를 한 경우에는 false로 반환 좋아요를 하지 않은 경우에는 true로 반환해서 조회할때 true인 사용자만 확인이 가능한 것 까지 구현하였습니다.

 

[알게된 점]

기능을 구상하기 전에 미리 어떤 기능을 구현할 것 인지 정리하는게 중요하다고 느꼈습니다.


문제 해결 과정 2-  서버 오류

[문제]
git pull을 하고 front를 확인하기 위해 node app.js를 실행하고 웹사이트에 접속하니 아래와 같은 상황이 생겼습니다.

Error: secret option required for sessions
    at session (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express-session/index.js:200:12)
    at Layer.handle [as handle_request] (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:328:13)
    at /Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:286:9
    at Function.process_params (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:346:12)
    at next (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:280:10)
    at jsonParser (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/body-parser/lib/types/json.js:110:7)
    at Layer.handle [as handle_request] (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:328:13)
    at /Users/hyerim/Desktop/sparta/06. newsfeed_team/News-Feed-Project/node_modules/express/lib/router/index.js:286:9

 

[시도 및 해결]

https://stackoverflow.com/questions/49987007/error-secret-option-required-for-sessions-espress-session

해당 사이트에 들어가 확인을 하니 

const app = express();
app.use(session({ secret: 'somevalue' }));

이러한 코드가 있었습니다. secret설정을 하면 된다고 해서 시도해보니 잘 해결되었습니다.

 

app.js

require('dotenv').config();

const express = require('express');
const session = require('express-session');
const MemoryStore = require('memorystore')(session);
const router = require('./routes/index.route.js');
const viewRouter = require('./views/router');
const { SESSION_SECRET_KEY } = process.env;

const dotenv = require('dotenv');
dotenv.config();

const app = express();
const PORT = 3000;
app.use(express.json());
app.use(session({ secret: 'somevalue' }));
app.use(
  session({
    secret: SESSION_SECRET_KEY,
    resave: false,
    rolling: true,
    saveUninitialized: false,
    store: new MemoryStore({ checkPeriod: 1000 * 60 * 60 }),
    cookie: {
      maxAge: 1000 * 60 * 60,
    },
  })
);

app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/views/static'));

app.use('/', viewRouter);

app.use('/api', router);

app.listen(PORT, () => {
  console.log(PORT, '포트 번호로 서버가 실행되었습니다.');
});

 

[알게된 점]

생각보다 어렵게 생각하지 않아도 금방 해결되는 문제가 많은 것 같습니다.