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

최은총님의 프로필 이미지
최은총

작성한 질문수

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

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

작성

·

276

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

 

 

답변 1

2

최은총님의 프로필 이미지
최은총
질문자

해결되었습니다.

아침에 일어나서 다시보니

 

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

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

최은총님의 프로필 이미지
최은총

작성한 질문수

질문하기