티스토리 뷰
반응형
06. 기존 API도 DB를 사용하도록 바꾸기
-
- 기존 API가 어떻게 작성되어 있었나요?
- 아마 코드 안에서 항상 같은 응답 값을 반환하도록 작성되어 있었을거예요.
- 이제는 고정된 응답 값이 아닌, 위에서 만든 상품 생성 API를 호출했을때 여러분의 MongoDB에 저장된 데이터를 가져오도록 할거예요!
더보기💡 만약 저장된 데이터가 없다면 반드시 상품을 3~5개정도는 생성하고 다음 과정을 따라주세요!- 상품 목록 API 개선하기
-
router.get("/goods", async (req, res, next) => { const goods = await Goods.find(); res.json({ goods }); });
- 상품 상세 조회 API 개선하기
-
router.get("/goods/:goodsId", async (req, res) => { const { goodsId } = req.params; const goods = await Goods.findOne({ goodsId }); res.json({ goods }); });
상품 목록 API에 필터링 기능 추가
-
- 필터링은 뭐고, 어떻게 구현하면 될까요?
- 필터링은 요청자가 원하는 데이터만 걸러내주는것을 말합니다.
- 거름망에 불순물을 거르듯, 우리가 원하는 데이터 이외에는 불순물 취급을 하며 원하는 데이터만 취하는것이 목적이라고 볼 수 있습니다.
- 걸러낸 데이터만 응답 값으로 보내면 이것이 필터링 기능이 포함된 API다. 라고 정의 할 수 있습니다.
- Query String이란 뭘까?
- URL의 맨 뒤에 ?부터 시작되어 parameter=value 로 key 값과 value 값이 나뉩니다.
- 리소스에 대한 표현이 아닌 부가 정보는 주로 이 Query String으로 데이터를 전달받는게 일반적입니다.
- ex) category가 food인 값을 요청하고자 할때: http://localhost:3000/api/goods?category=food
- 필터링 기능 구현
- /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 |