인프런 커뮤니티 질문&답변

한현묵님의 프로필 이미지

작성한 질문수

비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지

맛집 목록 조회 API 구현

맛집목록 api조회

23.01.18 13:52 작성

·

699

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

6분36초에 보면 한식카테고리만 검색했을 때 구이도 나오는 걸 확인 할 수 있습니다.

이후 편집과정에서 어떤 부분 수정하셔서 한식만 검색되었는지 알 수 있을까요?

강의 코드를 베끼고 있는데 카테고리 넣어서 조회해도 모든목록이 다나와버리고 있어서 ..

 

인덱스컨트롤러 코드 첨부합니다.

const { pool } = require("../../config/database");
const { logger } = require("../../config/winston");
const jwt = require("jsonwebtoken");
const secret = require("../../config/secret");
const indexDao = require("../dao/indexDao");

// 식당 조회
exports.readRestaurants = async function (req, res) {
  const { category } = req.query;
  
  // 카테고리 값이 넘어왔다면, 유효한 값인지 체크
  if (category) {
    const validCategory = [
      "한식",
      "중식",
      "일식",
      "양식",
      "분식",
      "구이",
      "회/초밥",
      "기타",
    ];

    if (!validCategory.includes(category)) {
      return res.send({
        result: rows,
        isSuccess: false,
        code: 400, // 요청 실패시 400번대 코드
        message: "유효한 카테고리가 아닙니다.",
      });
    }
  }

  try {
    const connection = await pool.getConnection(async (conn) => conn);
    try {
      const [rows] = await indexDao.selectRestaurants(connection, category);

      return res.send({
        result: rows,
        isSuccess: true,
        code: 200, // 요청 실패시 400번대 코드
        message: "식당 목록 요청 성공",
      });
    } catch (err) {
      logger.error(`readRestaurants Query error\n: ${JSON.stringify(err)}`);
      return false;
    } finally {
      connection.release();
    }
  } catch (err) {
    logger.error(`readRestaurants DB Connection error\n: ${JSON.stringify(err)}`);
    return false;
  }
};

 

스크린샷 2023-01-18 오후 2.00.57.png

그리고 여기서 만들어 놓지 않은 카테고리를 입력하고 send를 누르면

스크린샷 2023-01-18 오후 2.01.20.pngcould not get response라고 나오고

터미널에 에러가 뜹니다.

memilmooki@hanhyeonmug-ui-MacBookAir Node-Template-For-Food-Map-main % node index
.js
2023-01-18 14:00:25 info: undefined - API Server Start At Port 3000
/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/src/controllers/indexController.js:26
        result: rows,
                ^

ReferenceError: rows is not defined
    at exports.readRestaurants (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/src/controllers/indexController.js:26:17)
    at Layer.handle [as handle_request] (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/route.js:144:13)
    at Route.dispatch (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/route.js:114:3)
    at Layer.handle [as handle_request] (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/layer.js:95:5)
    at /Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/index.js:284:15
    at Function.process_params (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/index.js:346:12)
    at next (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/express/lib/router/index.js:280:10)
    at SendStream.error (/Users/memilmooki/Downloads/NODE-TEMPLATE-FOR-FOOD-MAP-MAIN/node_modules/serve-static/index.js:121:7)
    at SendStream.emit (node:events:513:28)

Node.js v19.0.1
memilmooki@hanhyeonmug-ui-MacBookAir Node-Template-For-Food-Map-main % 

답변 3

0

한현묵님의 프로필 이미지
한현묵
질문자

2023. 01. 25. 15:31

정말 감사합니다 ㅠ ㅠ ㅠ 마무리까지 열심히 해보겠습니다.

0

Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

2023. 01. 19. 21:00

카테고리별 음식점 조회는 selectRestaurants에 넘겨주는 category라는 파라미터를 통해 처리할 수 있습니다. 구체적으로는 selectRestaurants를 어떻게 구현해두셨는지 확인을 해야 알 수 있습니다. 코드를 첨부해주시면 상세히 도와드리겠습니다.

감사합니다.

한현묵님의 프로필 이미지
한현묵
질문자

2023. 01. 20. 15:00

selecRestaurants가 두군데 있는데 indexController와 indexDao

indexController먼저 첨부합니다.

const { pool } = require("../../config/database");
const { logger } = require("../../config/winston");
const jwt = require("jsonwebtoken");
const secret = require("../../config/secret");
const indexDao = require("../dao/indexDao");

// 식당 조회
exports.readRestaurants = async function (req, res) {
  const { category } = req.query;
  
  // 카테고리 값이 넘어왔다면, 유효한 값인지 체크
  if (category) {
    const validCategory = [
      "한식",
      "중식",
      "일식",
      "양식",
      "분식",
      "구이",
      "회/초밥",
      "기타",
    ];

    if (!validCategory.includes(category)) {
      return res.send({
        isSuccess: false,
        code: 400, // 요청 실패시 400번대 코드
        message: "유효한 카테고리가 아닙니다.",
      });
    };
  }

  try {
    const connection = await pool.getConnection(async (conn) => conn);
    try {
      const [rows] = await indexDao.selectRestaurants(connection, category);

      return res.send({
        result: rows,
        isSuccess: true,
        code: 200, // 요청 실패시 400번대 코드
        message: "식당 목록 요청 성공",
      });
    } catch (err) {
      logger.error(`readRestaurants Query error\n: ${JSON.stringify(err)}`);
      return false;
    } finally {
      connection.release();
    }
  } catch (err) {
    logger.error(`readRestaurants DB Connection error\n: ${JSON.stringify(err)}`);
    return false;
  }
};


// 예시 코드
exports.example = async function (req, res) {
  try {
    const connection = await pool.getConnection(async (conn) => conn);
    try {
      const [rows] = await indexDao.exampleDao(connection);

      return res.send({
        result: rows,
        isSuccess: true,
        code: 200, // 요청 실패시 400번대 코드
        message: "요청 성공",
      });
    } catch (err) {
      logger.error(`example Query error\n: ${JSON.stringify(err)}`);
      return false;
    } finally {
      connection.release();
    }
  } catch (err) {
    logger.error(`example DB Connection error\n: ${JSON.stringify(err)}`);
    return false;
  }
};

 

아래는 indexDao입니다.

const { pool } = require("../../config/database");

exports.selectRestaurants = async function (connection, category) {
  const selectAllRestaurantsQuery = `SELECT title, address, category, videoUrl FROM Restaurants where status = 'A';`;
  const selectCategorizedRestaurantsQuery = `SELECT title, address, category, videoUrl FROM Restaurants where status ='A' and category = '?';`;

  const Params = [category];

  const Query = category 
  ? selectAllRestaurantsQuery 
  : selectCategorizedRestaurantsQuery;

  const rows = await connection.query(Query, Params);

  return rows;
};
Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

2023. 01. 20. 19:32

dao 에서 삼항연산자 결과가 반대로 되어야 합니다.

category가 존재한다면 카테고리가 포함된 결과를, 그렇지 않다면 전체를 보여줘야합니다.

  const Query = category 
  ? selectCategorizedRestaurantsQuery
  : selectAllRestaurantsQuery;

0

Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

2023. 01. 19. 20:57

안녕하세요.

존재하지 않는 카테고리 검색에 대한 에러 원인은 다음과 같습니다.

result에서 rows가 정의되기 전에 참조를 했기 때문입니다. rows는 db요청을 해서 가져오는 이 코드보다 아래에 존재하는 코드입니다.

if (!validCategory.includes(category)) {
      return res.send({
        result: rows,
        isSuccess: false,
        code: 400, // 요청 실패시 400번대 코드
        message: "유효한 카테고리가 아닙니다.",
      });
    }
  }
한현묵님의 프로필 이미지
한현묵
질문자

2023. 01. 20. 14:57

감사합니다 rows는 삭제했습니다.

강의에서 놓쳐버렸군요 제가