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

이승훈님의 프로필 이미지

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

crud 관련 질문 드립니다.

해결된 질문

22.02.04 19:05 작성

·

303

0

 제가 간단하게 데이터베이스를 참조해서 유저를 생성, 조회, 수정, 삭제 (대략 crud)를 간단하게끔 할 수 있는 서버를 만들었습니다. 그런데 기능을 구현하는데 있어 문제가 되는점을 질문드리고자 합니다.

 

1. get메서드와 await User.findAll()을 사용해서 유저를 조회하는 라우터를 사용하려합니다. 만약 유저가 없을 때, 다음 코드는 []를 출력합니다.

const provided = await User.findAll();
console.log(provided) // []

그래서 유저가 없을 때 (테이블이 비어있을때)는 저런 결과를 출력하는구나 해서 조건문을 다음과 같이 구성했습니다.

if (provided === []) {
            res.send("현재 유저가 없습니다.");
        }

그런데 조건문에 조건이 성사되지 않아 다음 로직으로 넘어가게 됩니다. 조건문의 식을 어떤식으로 구성해야지 조건문에 걸리게 될까요?

 

2. patch메서드와 await User.update()를 사용해서 유저의 정보를 편집하는 라우터를 사용하려합니다. 다음과 같은 코드가 사용됩니다.

const modified = await User.update(
            {
                name,
                age,
                married,
                comment,
            },
            {
                where: { name: params },
            }
        );

여기 까지는 문제가 없습니다. 데이터베이스를 확인해보면 데이터가 존재합니다. 한가지 아쉬운건 어떤점이 변경되었는지 보여주고싶은데 제가 구성한 html에 다음과 같이 출력됩니다.

유저가 변경되었습니다!

[1]

제 생각에는 update 함수안에 로직의 문제 처럼 보여집니다. 로직을 어떻게 수정하면 좋을까요?

 

3. 유저의 정보를 수정하거나 삭제할 때 "/user~~/:who" 처럼 사용한 후 req.params.who로 유저의 이름을 받아내는 식으로 사용합니다. 한 가지 아쉬운 건 만약 유저의 이름이 영어가 아닌 한글이라면 who에 한글을 넣었을 때 제대로 동작하지 않는다는겁니다. 제 이름으로 유저를 만들고 삭제하기 위해 await User.destory가 포함된 라우터에 제 이름을 넣고 delete요청을 다음과 같이 보냈습니다.

포스트맨을 이용하였습니다.

DELETE /userRemove/이 존재하지 않습니다.

404

Error: DELETE /userRemove/이 존재하지 않습니다.
    at D:\Coding\JS\Node\Node.js_Bible\sql-test\app.js:44:19
    at Layer.handle [as handle_request] (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:323:13)
    at D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:341:12)
    at next (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:275:10)
    at D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:641:15
    at next (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:260:14)
    at Function.handle (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:174:3)
    at router (D:\Coding\JS\Node\Node.js_Bible\sql-test\node_modules\express\lib\router\index.js:47:12)

404처리 미들웨어에서 출력되었습니다. 마치 라우터가 없다는 듯이 출력이 됩니다. 한글이 들어가서 encodeURIComponent를 고려해보긴했는데 라우트 매개변수에 encodeURIComponent를 어떤 식으로 적용해야 할지 모르겠더군요. 만약 아래와 같이 사용한다면 에러가 발생합니다.

app.get(`/Hello/:${encodeURIComponent(id)}`, (req, res) => {
    res.send(`Hello ${req.params.id}`);
});
ReferenceError: id is not defined

 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2022. 02. 04. 19:54

1. if (provided.length) 입니다. 객체끼리는 비교할 수 없습니다.

2. 그 로직을 어떻게 작성하셨는데요? 참고로 sequelize에는 changed라는 메서드가 있습니다. 바꾼 필드를 알려줍니다.

3. encodeURIComponent는 라우터에 적용하는게 아니라 postman에서 보내는 이승훈 문자에 적용하셔야 합니다. postman에서 글자를 encodeURIComponent 하세요. 아래 글 따라서요.

https://stackoverflow.com/questions/43611238/url-encode-postman-variable

이승훈님의 프로필 이미지
이승훈
질문자

2022. 02. 04. 20:12

2번 질문에서 작성된 로직은 아래와 같습니다.

const modified = await User.update(
            {
                name,
                age,
                married,
                comment,
            },
            {
                where: { name: params },
            }
        );
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2022. 02. 04. 20:44

이건 로직이라고 하기 뭐한데요.. ㅎㅎ 그냥 update 메서드를 쓰시고 리턴값을 그대로 화면에 렌더링하셨나보네요. 시퀄라이즈에 changed 메서드가 있습니다만, 실제로 어떤 컬럼이 바뀌었는지 알려면 원본과 수정한 값이 모두 있어야 합니다. 즉, 원본도 find로 가져오셔야 합니다. 그리고 직접 코드를 짜서 name, age, married, comment 중에 뭐가 달라졌는지 확인하셔야 합니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2022. 02. 04. 20:45

저기에 나오는 [1]는 update 쿼리로 1개의 row가 업데이트되었다는 의미입니다.

이승훈님의 프로필 이미지
이승훈
질문자

2022. 02. 04. 20:59

친절한 답변 감사드립니다!