mongoose를 사용하여 mongoDB를 node.js에서 사용하기 2 + get( api 표현 )

하이루·2021년 12월 5일
0

request에 맞춰 mongoDB에서 데이터를 가져와 response하기

메인 index.js에 추가되는 부분

const goodsRouter = require("./routers/goods");
      app.use("/api", [goodsRouter]);
  
  

--> 위 코드를 통해 아래에 있는 모듈이 메인 index.js에 추가되는 것이다.


goods.js파일에서 라우터에 등록된 path들은 "goods/" 와 "/goods/:goodsId"이다.

하지만 실제로 이 코드에 url을 통해 request하려면 http://도메인/api/goods 혹은 http://도메인/api/goods/22 등의 형식으로 접근해야 한다.

왜냐하면 아래의 코드에 해당하는 부분에서 /api 이후의 path에서 해당 라우터로 들어갈 것이라고 설정했기 때문이다.

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

1. path부분 마지막에 "?데이터명=데이터내용" 으로 url로 데이터를 보낼 수 있음

2. 위의 경우처럼 라우터에 등록된 path가 "/:데이터명"과 같은 식일 경우, '/:데이터명'에 해당하는 부분에 임의의 데이터를 넣으면 그것이 데이터로써 전달됨

위 두가지의 예시)
"/goods"
http://도메인/api/goods?category=선택할카테고리명 --> 해당 카테고리에 해당하는 데이터들이 mongoDB에서 추출되어 나옴

"goods/:goodId"
http://도메인/api/goods/숫자 --> 해당 숫자의 goodsId를 가지는 데이터가 mongoDB에서 추출되어 나옴

--> goods.js파일의 내용은 아래에 있음


router폴더를 만든 후 그 안에 만드는 goods.js

--> mongoDB에서 데이터를 가져와서 response하는 모듈 ( 2개의 api를 추가하는 모듈이다. )

  const express = require("express");
  const Goods = require("../schemas/Goods");

  const router = express.Router();

  router.get("/goods", async (req, res, next) => {
    try {
      const { category } = req.query;
      const goods = await Goods.find({ category }).sort("-goodsId");
      res.json({ goods: goods });
    } catch (err) {
      console.error(err);
      next(err);
    }
  });

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

  module.exports = router;
  

이 부분에서 가져올 데이터의 스키마를 가져온다.
++ express에서 라우터 객체를 가져온다.
( 메인 index.js에서는 app.get으로 라우팅하는데 반해 이렇게 외부 js로 라우팅하려면 router.get 등등을 사용하여야 한다. )

    const express = require("express");
    const Goods = require("../schemas/Goods");

    const router = express.Router();
    

이 부분에서 라우팅을 한다.
그 내용은 query형식으로 데이터를 받아 그 데이터에 부합하는 정보들을 mongoDB로부터 받아서 json형태로 반환하는 것이다.

( 여기서는 category에 해당하는 데이터가 들어오고, 해당 category와 일치하는 데이터들을 mongoDB에서 찾아
goodsID를 기준으로 정렬한 후에 json형식으로 만들어 response해주고 있다. )

  router.get("/goods", async (req, res, next) => {
    try {
      const { category } = req.query;
      const goods = await Goods.find({ category }).sort("-goodsId");
      res.json({ goods: goods });
    } catch (err) {
      console.error(err);
      next(err);
    }
  });
       

이 부분 또한 라우팅을 한다.

path에서 데이터를 받아 헤당 id와 일치하는 데이터를 mongoDB로부터 받아 json형식으로 만들어 response한다.

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

위 코드의 path 경로를 나타내는 "/goods/:goodsId" 부분에서 /:goodsId 부분은 특별한 의미가 있다.

라우팅을 위한 path설정 부분에서 '/:aaaa' 와 같은 식의 경우, 해당 부분에 url 정보가 데이터로서 들어오게 된다.

--> 예를 들어 위 코드에 라우팅되는 path들은 /goods/5, /goods/20 등등이다.
이때 goods뒤의 숫자 5, 20은 goodsId로써 인식되며 해당 코드로 라우팅되게 된다.


이 부분에서 위에서 라우팅한 코드들을 다른 코드에서 사용할 수 있도록 한다.
--> 즉, 메인 index.js가 라우터의 적용을 받을 수 있도록 (import할 수 있도록) 하는 부분이다.

  module.exports = router;
      
      

      
profile
ㅎㅎ

0개의 댓글