20230616

M·2023년 6월 16일
0

TIL

목록 보기
22/42

Node.js와 express로 블로그 서버 만들기

와아~ 너무 너무 ~ 재밌겠당~

일단 순서를.. 정했다
1. Create (생성) 기능 구현
2. Read (조회) 기능 구현
3. Update (수정) 기능 구현
4. Delete (삭제) 기능 구현

app.js 파일을 만들어줬다.

const express = require('express');
const app = express();
const port = 3000;

const postsRouter = require('./routes/post.js');
const commentsRouter = require('./routes/comment.js');

const connect = require('./schemas');
connect();

// body 파서 미들웨어를 사용하기 위한 설정
app.use(express.json());

// postsRouter를 '/' 경로에 적용
app.use('/', [postsRouter, commentsRouter]);

// 서버 시작
app.listen(port, () => {
  console.log(port, '포트로 서버가 열렸어요!'); // 서버가 시작되면 콘솔에 포트 번호를 출력합니다.
});

mongodb를 연결해주는 코드는 schemas 디렉터리 안에 있는 index.js에 작성했다. 바로 connect함수이다.

게시글에 대한 스키마 정의

posts.js

const mongoose = require('mongoose');
// 'Posts'에 대한 스키마 정의
const postsSchema = new mongoose.Schema({
  // user 필드: 문자열 타입, 필수 입력, 고유한 값
  user: {
    type: String,
    required: true,
    unique: true,
  },

  // password 필드: 숫자 타입, 필수 입력
  password: {
    type: Number,
    required: true,
    unique: true,
  },

  // title 필드: 문자열 타입, 필수 입력
  title: {
    type: String,
    required: true,
  },

  // content 필드: 문자열 타입, 필수 입력
  content: {
    type: String,
    required: true,
  },

  // createdAt 필드: 날짜 타입, 필수 입력
  createdAt: {
    type: Date,
    required: true,
  },
});

// 'Posts' 모델을 생성하고 postsSchema를 이용하여 스키마를 설정합니다.
module.exports = mongoose.model('Posts', postsSchema);

여기까진 크게 어렵지 않았다 . 강의에서 배운 내용이기에..
required는 꼭 값이 있어야하는지에 대하여 정해주는것이다.
unique는 중복되는 값을 막기 위함이다. 저렇게 하는게 맞으려나..

routes폴더에 있는 post.js

// 게시글 작성 API
router.post('/posts', async (req, res) => {
  const { user, password, title, content } = req.body;

  // 이미 존재하는 게시물인지 확인합니다.
  const existingPosts = await Posts.find({ user });
  if (existingPosts.length) {
    return res.status(400).json({
      success: false,
      errorMessage: '중복되는 게시물이 존재합니다.',
    });
  }

  // 새로운 게시물을 생성합니다.
  const createdPosts = await Posts.create({
    user,
    password,
    title,
    content,
    createdAt: new Date(),
  });

일단 기본적으로 유저가 등록할것이 user, password, title, content이니
body에서 리퀘스트 받은것들을 구조분해할당을 사용해서 변수에 넣어줬다.

Posts는 posts.js 에서 module.exports로 보내준 것이다.
중복을 허용하지 않기 위해서, db에서 해당하는 값이 이미 있는지 확인 해주는 코드를 짰다. db에 저장은 create()를 사용해서 저장했는데
createdAt(업데이트 시간은) new Date()를 사용해서 저장되게 했다.

// 전체 게시글 조회 API
router.get('/posts', async (req, res) => {
  try {
    const posts = await Posts.find()
      .select('-password -content -__v')
      .sort({ createdAt: -1 });
    // 데이터베이스에서 mongoos메서드 select를 사용해서 특정 필드들을 제외 한 후
    // 나머지 게시물을 조회하고, 작성 날짜 기준으로 내림차순으로 정렬합니다.

    // 조회된 게시물을 응답합니다.
    res.json({ data: posts });
  } catch (error) {
    // 오류가 발생한 경우 오류 메시지를 응답합니다.
    res.status(500).json({ error: '게시물 조회에 실패했습니다.' });
  }
});

저장된 데이터를 반환해주다보니... 비밀번호나 필요하지 않은 데이터도
함께 반환해줬다. 보안상의 이유가 있기도하고,,, 내 마음이 불편해서
여러가지 알아보다가 스키마에서 select: false 값을 넣어줬었는데
갑자기 삭제랑 수정기능때 비밀번호를 못 받아오니.. 작동하지 않았다.

그러다 알게된게 select()메서드이다. 자바스크립트 문법은 아니고
mongoose 메서드라고 한다. 특정 필드들만 보여주거나, 보여주지 않을때 사용한다. 나는 보여주지 않을 데이터가 더 적었기에 .. -를 붙여주었다.
그 이후에 다시 보니 -를 붙인 필드들은 반환해주지 않는걸 확인했다.
그리고 날짜 기준으로 내림차순으로 정렬하려고 sort()메서드를 사용했다.

지금은 완성을 다 했지만.. 솔직히 도움이 되는건지 모르겠다.
내가 작성한 코드도 버벅이면서 읽고.. 솔직히 자신감이 많이 떨어졌따.

profile
자바스크립트부터 공부하는 사람

0개의 댓글