티스토리 뷰

항해/주특기 1주차

[node js] 3주차 -2

타올이 2022. 1. 23. 17:39
반응형

06. 기존 API도 DB를 사용하도록 바꾸기

    1. 기존 API가 어떻게 작성되어 있었나요?
    • 아마 코드 안에서 항상 같은 응답 값을 반환하도록 작성되어 있었을거예요.
    • 이제는 고정된 응답 값이 아닌, 위에서 만든 상품 생성 API를 호출했을때 여러분의 MongoDB에 저장된 데이터를 가져오도록 할거예요!
    더보기
    💡 만약 저장된 데이터가 없다면 반드시 상품을 3~5개정도는 생성하고 다음 과정을 따라주세요!
    1. 상품 목록 API 개선하기
  • router.get("/goods", async (req, res, next) => {
        const goods = await Goods.find();
        res.json({ goods });
    });
    
    1. 상품 상세 조회 API 개선하기
  • router.get("/goods/:goodsId", async (req, res) => {
      const { goodsId } = req.params;
      const goods = await Goods.findOne({ goodsId });
      res.json({ goods });
    });
    

상품 목록 API에 필터링 기능 추가

    1. 필터링은 뭐고, 어떻게 구현하면 될까요?
    • 필터링은 요청자가 원하는 데이터만 걸러내주는것을 말합니다.
    • 거름망에 불순물을 거르듯, 우리가 원하는 데이터 이외에는 불순물 취급을 하며 원하는 데이터만 취하는것이 목적이라고 볼 수 있습니다.
    • 걸러낸 데이터만 응답 값으로 보내면 이것이 필터링 기능이 포함된 API다. 라고 정의 할 수 있습니다.
    1. Query String이란 뭘까?
    • URL의 맨 뒤에 ?부터 시작되어 parameter=value 로 key 값과 value 값이 나뉩니다.
    • 리소스에 대한 표현이 아닌 부가 정보는 주로 이 Query String으로 데이터를 전달받는게 일반적입니다.
    • ex) category가 food인 값을 요청하고자 할때: http://localhost:3000/api/goods?category=food
    1. 필터링 기능 구현
    • /schemas/index.js 에 옵션 추가
  • connect 함수 두번째 인자에는 ignoreUndefined 라는 옵션을 넘길 수 있는데요, 이 옵션을 넘겨야 아래 필터링 예시에서 작성한 코드처럼 category를 넘기지 않았을 경우에는 문제 없이 모든 데이터를 불러올 수 있도록 돕습니다. (category === undefined 인 상황을 대비!)
  • const connect = () => {
        mongoose.connect("mongodb://localhost:27017/spa_mall", { ignoreUndefined: true }).catch((err) => {
            console.error(err);
        });
    };
    
  • 기존 상품 목록 API 필터링 예시
router.get("/goods", async (req, res, next) => {
  const { category } = req.query;
  const goods = await Goods.find({ category });

  res.json({ goods });
});

app.js

const express = require('express');
const connect = require("./schemas")
const { nextTick } = require('process');
const app = express();
const port = 3000;
 
connect();

 
const goodsRouter = require('./routes/goods')

 
const requstMiddleware = (req,res,next)=>{
 
    console.log('Request URL:', req.originalUrl, " - ", new Date());
 
    next();
};

 
app.use(express.json());

 
app.use(requstMiddleware);

 
app.use("/api",[goodsRouter]);

 
app.get('/',(req,res)=>{
    res.send("Hello world");
});

 
app.listen(port, ()=>{
    console.log(port, "포트로 서버 연결!")
});

goods.js/router

const express = require('express')
 
const Goods = require('../schemas/goods')
 
const router = express.Router();
 
router.get("/", (req, res) => {
  res.send('this is root page')
});

 
// // 24)지움
// const goods = [
//     {
//       goodsId: 4,
//       name: "상품 4",
//       thumbnailUrl:
//       category: "drink",
//       price: 0.1,
//     },
//     {
//       goodsId: 3,
//       name: "상품 3",
//       thumbnailUrl:
//       category: "drink",
//       price: 2.2,
//     },
//     {
//       goodsId: 2,
//       name: "상품 2",
//       thumbnailUrl:
//       category: "drink",
//       price: 0.11,
//     },
//     {
//       goodsId: 1,
//       name: "상품 1",
//       thumbnailUrl:
//       category: "drink",
//       price: 6.2,
//     },
//   ];

router.get("/goods", async (req, res) => {
  // 24) 쿼리 스트링 만들기
  const {category} = req.query;

  // 21) 기존 api지우기
  // 25) category 쿼리 추가
  const goods = await Goods.find({ category });
 
 
  res.json({
 
    goods,
  });
});

 
router.get("/goods/:goodsId", async (req, res) => {
 
  const { goodsId } = req.params;

  // 22) goods를 참조하지 않고 직접가져옴
  const [detail] = await Goods.find({ goodsId: Number(goodsId) });
  // 23) 지움
  // const [detail] = goods.filter((item)=> item.goodsId === Number(goodsId));
  res.json({
    detail,
  });
});

 
router.post("/goods", async (req, res) => {
  const { goodsId, name, thumbnailUrl, category, price } = req.body;

  const goods = await Goods.find({ goodsId });
 
  if (goods.length) {
    return res.status(400).json({ success: false, erroerMessge: "이미 있는 데이터입니다." })
  }
 
  const createdGoods = await Goods.create({ goodsId, name, thumbnailUrl, category, price });

  res.json({ goods: createdGoods });
});


 
module.exports = router;

goods.js/schema

const mongoose = require('mongoose');

 
const goodsSchma = mongoose.Schema({
    goodsId: {
        type: Number,
        required: true,
        unique: true,
    },
    name: {
        type: String,
        required: true,
        unique: true,
    },
    thumbnailUrl: {
        type: String,
    },
    category: {
        type: String,
    },
    price: {
        type: Number,
    },
});

// Goods는 모델이름
module.exports = mongoose.model("Goods",goodsSchma)

index.js

const mongoose = require("mongoose")

// 컨넥트
// 26) category 쿼리 때 undefinde를 무시하라는 말을 넣음
const connect = () => {
    mongoose.connect("mongodb://localhost:27017/spa_mall",{ ignoreUndefined: true }).catch((err)=>{
        // 에러가 뜰경우 콘솔에 err가 찍임
        console.error(err);
    });
};

module.exports = connect;

 

반응형

'항해 > 주특기 1주차' 카테고리의 다른 글

[node js] 3주차 -4  (0) 2022.01.23
[node js] 3주차 -3  (0) 2022.01.23
[node js] 3주차 -1  (0) 2022.01.23
[node js] 2주차 -4  (0) 2022.01.23
[node js] 2주차 -3  (0) 2022.01.23
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
링크
글 보관함