[Inflearn][JohnAhn] 노드 리액트 기초 (11~12)

ann·2023년 11월 2일
0
  • npm install jsonwebtoken --save 설치
  • npm install cookie-parser --save 설치
index.js==================================
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())

const cookieParser = require('cookie-parser')
app.use(cookieParser())

app.post('/login', (req, res) => {
  User
  .findOne({email: req.body.email})
  .then((user) => {
    if(!user){
      return res.json({
        loginSuccess: false,
        messsage: "제공된 이메일에 해당하는 유저가 없습니다."
      })
    }
    user.comparePassword(req.body.password, (err, isMatch) => {
      if(!isMatch) {
        return res.json({loginSuccess: false, messsage: "비밀번호가 틀렸습니다."})
      }
      user.generateToken((err, user)=>{
        if(err) {
          return res.status(400).send(err)
        }
        res.cookie("x_auth", user.token)
        .status(200)
        .json({loginSuccess: true, userId: user._id})
      })
    })
  })
  .catch((err) => {
    return res.status(400).send(err)
  })
})
models/User.js=====================
const jwt = require('jsonwebtoken')

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

userSchema.methods.generateToken = function(cb) {
    var user = this;
    var token = jwt.sign(user._id.toHexString(), 'secretToken')

    user.token = token
    user
    .save()
    .then((user) => {
        cb(null, user)
    })
    .catch((err) => {
        cb(err)
    })
}
  • modles/User.js에서 userSchema.methods.generateToken 중에 user._id.toHexString()를 그냥 user._id()로 쓰게 되면 Error: Expected "payload" to be a plain object 오류가 남.
    따라서 toHexString()를 붙여주면 해결됨.

0개의 댓글