강의

멘토링

커뮤니티

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

uphoon님의 프로필 이미지
uphoon

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

로그인 500 오류

작성

·

227

0

const express = require('express')
const bcrypt = require('bcrypt')
const { User } = require('../models')
const passport = require('passport')
const router = express.Router();

router.post('/login', (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
        if(err){
            console.error(err)
            return next(err)
        }
        if(info){
            return res.status(401).send(info.reason);
        }
        return req.login(user, async(loginErr)=>{
            if(loginErr) {
                console.error(loginErr)
                return next(loginErr)
            }
            return res.status(200).json(user)
        })
    })(req, res, next)
})

router.post('/', async (req, res, next) => {
    try {
        const exUser = await User.findOne({
            where: {
                email: req.body.email,
            }
        });
        if (exUser) {
            return res.status(403).send('이미 사용 중인 아이디입니다.');
        }
        const hashedPassword = await bcrypt.hash(req.body.password, 12);
        await User.create({
            email: req.body.email,
            nickname: req.body.nick,
            password: hashedPassword,
        });
        res.status(201).send('ok');
    } catch (error) {
        console.error(error);
        next(error); // status 500
    }
})

router.get('/', (req, res, next) => {
    res.send('유저 페이지')
})

module.exports = router;
const passport = require('passport')
const local = require('./local')
const { User } = require('../models')

module.exports = () => {
    passport.serializeUser((user, done) => {
        done(user.id)
    })

    passport.deserializeUser(async (id, done) => {
        try{
            const user = await User.findOne({ where: { id } })
            done(null, user)
        }catch(error){
            console.error(error)
            done(error)
        }
        
    })

    local();
}
const passport = require('passport')
const { Strategy: LocalStrategy } = require('passport-local')
const bcrypt = require('bcrypt')
const { User } = require('../models')

module.exports = () => {
    passport.use(new LocalStrategy({
        usernameField: 'email',
        passwrodField: 'password',
    }, async (email, password, done) => {
        try {
            const user = await User.findOne({
                where: { email }
            })
            if (!user) {
                done(null, false, { reason: '존재하지 않는 이메일 입니다!' })
            }
            const result = await bcrypt.compare(password, user.password)
            if (result) {
                return done(null, user)
            }
            return done(null, false, { reson: '비밀번호가 틀렸습니다.' })
        } catch (error) {
            console.error(error);
            return done(error);
        }
    }));
}
const express = require('express');
const postRouter = require('./routes/post')
const userRouter = require('./routes/user')
const db = require('./models');
const { urlencoded } = require('express');
const app = express();
const cors = require('cors')
const passportConfig = require('./passport');
const passport = require('passport');
const session = require('express-session')
const cookieParser = require('cookie-parser')
const dotenv = require('dotenv')

dotenv.config();

db.sequelize.sync()
    .then(() => {
        console.log('db 연결성공')
    })
    .catch(console.error)

passportConfig();

app.use(cors({
    origin: '*'
}))
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(cookieParser('nodebirdsecret'))
app.use(session({
    saveUninitialized: false,
    resave: false,
    secret: process.env.COOKIE_SECRET
}))
app.use(passport.initialize())
app.use(passport.session());

app.get('/', (req, res) => {
    res.send('hello express')
})

app.get('/api', (req, res) => {
    res.send('hello express')
})

app.get('/api/posts', (req, res) => {
    res.json([
        { id: 1, content: 'hello' },
        { id: 2, content: 'hello1' },
        { id: 3, content: 'hello2' },
    ]);
});

app.use('/post', postRouter)
app.use('/user', userRouter)

app.listen(3065, () => {
    console.log('서버 실행중!!')
});

회원가입 로직은 잘 작동되는데 로그인기능이 안돼는 코드 한번 봐주실수 있으실까요? 201통신이 하나 오는건 또 무엇인지... 500으로 오류가 나오더라구요 그 다음에

답변 1

0

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

서버 에러메시지를 보여주세요. 204는 cors는 성공했다는 겁니다.

uphoon님의 프로필 이미지
uphoon
질문자

아 선생님 해결했습니다. 감사합니다.

passport.deserializeUser(async (id, done) => {
        try{
            const user = await User.findOne({ where: { id } })
            done(null, user)
        }catch(error){
            console.error(error)
            done(error)
        }
        
    })

여기서 done 보낼때 null 값을 빼 먹었더라구요 감사합니다~!!

uphoon님의 프로필 이미지
uphoon
질문자

선생님 죄송합니다 궁금한게 좀 많아서요 ㅠㅠ

  useEffect(() => {
    if(!(me && me.id)){
      Router.push('/')
    }
  }, [])

로그인하지 않으면 메인화면으로 넘어가는 기능 부분인데 여기서 왜 me && me.id 까지 묶어 주나요? 그냥 me만 확인하면 되는것 아닌가요?

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

me가 빈 객체( {} )인 상황을 방지하기 위함입니다.

uphoon님의 프로필 이미지
uphoon

작성한 질문수

질문하기