inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

고수분들의 도움이 필요합니다.

334

최은총

작성한 질문수 2

0

11~12강에서 로그인기능을 구현할때 User.comparePassword is not a function라는 타입에러가 뜹니다.

stackoverflow, google등 여러 방책을 찾아봤지만 도대체 왜 User.comparePassword가 function으로 인식이 안되는지 모르겠습니다.

method명이 중복되어있지도 않고 User.js를 server.js에서 잘 받아오고 User객체로 접근하는 것인데 왜 함수가 아니라고 뜨는 걸까요. 제가 뭔가 착각하고 있는것 같은데 그게 뭔지 잘 모르겠습니다. 생각보다 간단한 오류인것 같은데 말이죠...

 

이러한 오류가 뜹니다.

node:events:491
      throw er; // Unhandled 'error' event
      ^

TypeError: User.comparePassword is not a function
    at /Users/choeeunchong/Documents/develop/react_node/server.js:70:10
    at /Users/choeeunchong/Documents/develop/react_node/node_modules/mongoose/lib/model.js:5207:18
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11)
Emitted 'error' event on Function instance at:
    at /Users/choeeunchong/Documents/develop/react_node/node_modules/mongoose/lib/model.js:5209:15
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11)

Node.js v18.11.0

 

 

server.js(index.js)

[nodemon] starting `node server.js`
listening on 8888
MonogeDB Conneted...
compare 들어가기전.
asd12345

디버깅을 통해서 server.js에서 로그인 기능 중, comparepassword으로 들어가기 직전까지는 잘 들어가는 것으로 확인을 했습니다.


const { User } = require("./models/User");



//로그인 기능
app.post("/login", function (req, res) {
  //console.log(req.body);

  //1. 입력된 이메일이 db에 있는지 확인한다.
  User.findOne({ email: req.body.email }, (err, user) => {
    if (!user) {
      return res.json({
        loginSuccess: false,
        message: "입력된 이메일에 해당하는 유저가 없습니다.",
      });
    }

    console.log("compare 들어가기전.");

    //2. 이메일에 해당하는 패드워드가 일치하는지 확인한다.
    console.log(req.body.password);
    User.comparePassword(req.body.password, (err, isMatch) => {
      console.log("comparePassword 안.");
      if (err) return res.status(400).send(err);
      if (!isMatch) {
        return res.json({
          loginSuccess: false,
          message: "비밀번호가 틀렸습니다.",
        });
      }
      console.log(req.body);

      //3. login 된경우 토큰생성
      user.generateToken((err, user) => {
        if (err) return res.status(400).send(err);

        //token을 쿠키에 저장한다.
        res
          .cookie("x_auth", user.token)
          .status(200)
          .json({ loginSuccess: true, userId: user._id });
        console.log(req.body);
      });
    });
  });
});

User.js

userSchema.methods.comparePassword = function (plainPassword, callback) {
  bcrypt.compare(plainPassword, this.password, function (err, isMatch) {
    if (err) return callback(err);
    return callback(null, isMatch);
  });
};

 

 

react nodejs

답변 1

2

최은총

해결되었습니다.

아침에 일어나서 다시보니

 

  1. 일단 fineone에서 받은 user객체를 통해서 이메일/비번을 체크해야했는데 User라는 새로운 객체를 만들어서 접근했습니다. 새로운 객체로 접근하면 req으로 받은 user는 비밀번호가 포함된 반면에 새로운 객체는 모든 값이 비어있는 상태이기에 일단 로직이 틀렸습니다.

  2. 그리고 아마 원인은 User.js에서 User 모델을 만드는 과정이 메소드 위에 있어서 메소드가 인식이 안되지 않았나 싶습니다.

깃 이메일이랑 비번이 필요하다고 하네요

0

38

1

404 에러

0

105

1

34강 인증 체크에서 element 사용 때문에 에러나시는 분들 이렇게 하심 됩니다.

0

121

1

로그인, 로그아웃, 토근 작동 안 함

0

242

0

9강 오류 어떻게 해결하나요?

0

195

1

localhost 에서 연결을 거부했습니다.

0

1944

4

포스트맨에서 true가 안떠요

0

152

1

왜 안되나요

0

130

1

몽고db 연결 오류가 납니다 위에껀 입력한 코드, 아래껀 터미널이에요

0

244

1

로그아웃 401 에러(Unauthorized)

0

506

2

암호가 해싱되지 않고 입력값 그대로 db에 저장되는 문제

0

152

1

7강중에서

0

167

2

User.findByToken is not a function

0

214

1

루트 디렉토리

0

275

1

useState

0

564

1

프록시 잘 설정했는데도 404 오류 뜨는 분들

5

879

6

webpack 관련 에러 질문

0

221

1

리액트 관련 질문

0

275

1

14강 로그아웃 안됨

0

319

1

mongoDB 데이터 확인하는 법

0

413

1

postman 에러

0

295

1

선생님 리덕스를 사용하면 어떠한 부분이 좋은지 알 수 있을까요?

0

236

1

다음과 같은 에러들이 발생합니다.

0

277

1

14강 로그아웃 기능 구현시 postman에서 Cannot POST 오류가 뜹니다.

0

380

1