inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

맛집 목록 조회 API 구현

맛집목록 api조회

799

한현묵

작성한 질문수 4

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 % 

HTML/CSS javascript mysql git rest-api github aws

답변 3

0

한현묵

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

0

Jay

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

감사합니다.

0

한현묵

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;
};

0

Jay

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

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

  const Query = category 
  ? selectCategorizedRestaurantsQuery
  : selectAllRestaurantsQuery;

0

Jay

안녕하세요.

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

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

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

0

한현묵

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

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

live server가 안 떠요..

0

79

1

카카오맵 API 가 안뜹니다...

0

673

2

카카오맵API 지도 관련

0

172

1

Putty에서 nginx를 vi로 수정할때 오류

0

279

3

mysql과 선생님의 깃허브 코드연결

0

183

1

nodemon 실행오류

0

229

2

Azure 서버로 구축하고 작업하는 방법 알 수 있을까요?

0

257

2

css 적용 중 강의대로 적용되지 않아 질문 드립니다

0

347

2

강의를 잘 활용하는 법 추천 부탁드립니다.

0

283

1

MysqlWorkbench 접속문제

0

299

1

전체 핀이 조회되지 않습니다.

0

258

1

빅데이터 처리관련

1

281

1

섹션5의 2번째 강의 질문-setMap 비동기 처리 이유

0

234

1

PM2 EADDRINUSE 에러

0

407

2

인스턴스 중단 후 재시작

0

278

1

이미지 부분에 cctv 영상을 넣고 싶은데요.

0

582

2

노션 링크가 어디있나요 ?

1

308

1

axios 이후 마커 오류

0

290

0

service nginx restart 에러

0

709

1

섹션10 배포하기 unbuntu에서 root경로가 안뜹니다ㅠㅠ

0

498

3

선생님 추가적으로 새로운 페이지를 만드려고 하는데요...

0

246

1

코드 질문 드립니다!

0

225

1

혹시 강의자료 노션 내리셨나요?

0

237

1

노드몬 에러 참조하세요

0

358

1