• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

axios 통신 오류

22.05.24 19:54 작성 조회수 419

0

안녕하세요. 로그아웃 기능을 구현하는데 axios통신이 되지 않아서 질문드립니다. 회원가입까지는 되고 이후에 toolbar에서 로그아웃을 클릭하면 첨부한 사진과 같이 axios 통신에러가 나는데 왜 그런지 잘 모르겠습니다.... 저는 로그아웃을 patch로 하지 않고 서버와 클라이언트에서 모두 post로 구현을 했습니다. patch로 바꿔바도 결과가 그대로 오류가 나옵니다.... 코드까지 올리겠습니다..

AuthContext.js

import React, { createContext, useState, useEffect } from "react";
import axios from "axios";

export const AuthContext = createContext()    //context 객체 만들기

export const AuthProvider = ({children}) => {      //provider
    const [user, setUser] = useState() //유저 로그인 정보를 받기 위한 저장소

    useEffect(()=>{
        if(user) axios.defaults.headers.common.sessionid=user.sessionId //user가 있을 경우 기본값으로 header에 sessionId를 입력
        else delete axios.defaults.headers.common.sessionid //user가 없는 경우 sessionid를 삭제
    }, [user])

    return (
        <AuthContext.Provider value={[user, setUser]}>       {/*provider를 통해 state와 set함수를 넘겨줌.*/}
            {children}
        </AuthContext.Provider>
    )
}

toolbar.js

import React, { useContext } from "react";
import { Link } from "react-router-dom";
import { AuthContext } from "../context/AuthContext";
import axios from 'axios'

const ToolBar = () => {
    const [user, setUser] = useContext(AuthContext)  //context 사용을 설정

    const Logout = async()=>{
        try{
            await axios.post('/users/logout') //로그아웃으로 post
            setUser() //
            console.log("로그아웃 완료")
        }catch(err){
            console.log(err)
        }
    }
    return (
        <div>
            <Link to='/'>
                <span style={{ marginRight: 10 }}></span>
            </Link>
            {user ? //이전에 공유하는 user가 존재 유무
                (<span onClick={(e)=>{Logout()}}>로그아웃</span>) :
                (<>
                    <Link to='/auth/login'>
                        <span style={{ marginRight: 10 }}>로그인</span>
                    </Link>
                    <Link to='/auth/register'>
                        <span >회원가입</span>
                    </Link>
                </>)
                }
        </div>
    )
}

export default ToolBar

userRouter.js

const { Router } = require('express')
const userRouter = Router()
const User = require('../models/User')
const { hash, compare } = require('bcryptjs')
const mongoose = require('mongoose')

userRouter.post('/register', async (req, res) => {
    try {
        if (req.body.password.length < 6) {
            throw new Error("6자리 이상으로 비밀번호를 입력하세요.")
        }
        if (req.body.username.length < 3) {
            throw new Error("3자리 이상으로 유저 이름을 입력하세요.")
        }

        const hashedPassword = await hash(req.body.password, 10) //비밀번호를 hash로 만들어 줌
       const user = await new User({ //user 객체를 생성
            name: req.body.name,
            username: req.body.username,
            hashedPassword: hashedPassword,                  //입력받은 req데이터를 객체에 저장.
            sessions: [{createdAt: new Date()}]
        }).save()
        const session = user.sessions[0] //회원가입이기 때문에 무조건 첫번째로 생성된 세션을 기준으로 잡음.
        res.json({
            message: "회원가입 완료",
            sessionId: session._id,
            name: user.name })

    } catch (err) {
        res.status(400).json({message: err.message})
    }
})

userRouter.post('/login', async (req, res)=>{
    try{
        const user = await User.findOne({username: req.body.username}) //mongoose의 내장함수로 요청정보에 맞는 유저를 찾는다.
        const isValid = await compare(req.body.password, user.hashedPassword) //요청된 비밀번호와 해쉬번호를 비교
        if(!isValid) throw new Error("잘못된 입력입니다.")
        user.sessions.push({createdAt: new Date()}) //유저의 세션을 추가
        const session = user.sessions[user.sessions.length-1] //session은 가장 최근에 만든 세션을 기준으로 잡음.
        await user.save() //user모델을 DB에 저장
        res.json({message: "로그인 성공!", sessionId:session._id, name:user.name})
    }catch(err){
        res.status(400).json({message: err.message})
    }
})

userRouter.post('/logout', async (req, res)=>{
    try{ //미들웨어를 갔다 온 뒤 처리
        if(!req.user) throw new Error("유효하지 않은 세션입니다.")
        await User.updateOne({_id:req.user.id}, //저장된 user의 id와 스키마의 id 같은 것을 찾아서 업데이트 함.
            {$pull: {sessions: {_id:req.headers.sessionid}}} //세션들 중 로그아웃할 세션id와 같은 세션을 pull을 통해 삭제함
        )
        res.json({success: "성공!"})
    }catch(err){
        res.status(400).json({message: err.message})
    }
})

module.exports = { userRouter }

 

답변 0

답변을 작성해보세요.

답변을 기다리고 있는 질문이에요.
첫번째 답변을 남겨보세요!