• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

passport로 로그인 에러 시 payload 전달 방법

22.08.03 17:03 작성 조회수 326

1

강사님, 안녕하세요.  

혼자서 해보려다가 도저히 모르겠어서 질문 드립니다. 

로그인 에러 시 각각 상황에 맞는 logInError를 안내하고 싶어서 제작 중인데, 

회원가입할때도 다른 작업할때도 에러나면 payload 값이 잘 나오던데, 

로그인 할때만 에러나면 Payload 값이 undefined 로 나오네요.

 

회원가입한적 없는 아이디일때 "존재하지 않는 이메일입니다"

 

아이디는 있으나 비밀번호가 틀렸을때 "비밀번호가 틀렸습니다"

 

/back/routes/user.js 에서

//SignUp
router.post('/', isNotLoggedIn, async (req, res, next) => {
  try {
    ***
    if (exUser) {
      return res.status(403).json('이미 가입된 아이디입니다.');
    }
    ***
  } catch (error) {
    console.error(error);
    next(error);
  }
});

이렇게 json 형태로 에러 메시지를 적어주면 front로 전달된다고 배웠고, 회원가입이나 다른 호출은 다 잘 출력됩니다.

그런데 login 쪽만 payload(logInError)가 undefined로 나옵니다. (개발자도구 네트워크에서는 메시지가 잘 찍힙니다.)

router.post('/login', isNotLoggedIn, (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    ***
    if (info) {
      return res.status(401).json(info.reason);
    }
    ***
  })(req, res, next);
});

 

/back/passport/local.js

***
module.exports = () => {
    passport.use(
        new LocalStrategy(
          ***
            async (userid, password, done) => {
                try {
                    ***
                    if (!user) {
                        return done(null, false, { reason: '존재하지 않는 이메일입니다!' });
                    }
                    ***
                    return done(null, false, { reason: '비밀번호가 틀렸습니다.' });
                } catch (error) {
                    ***
                }
            }
        )
    );
};

 

//회원가입 페이지

 

/front/reducers/user.js

 

//회원가입 페이지

 

//로그인 페이지

회원가입과 다르게 로그인은 passport가 쓰여서인듯 한데,

에러 났을때 payload 값을 가져오게 할 방법이 있을까요?

답변 1

답변을 작성해보세요.

0

toolkit이면 createAsyncThunk를 보셔야 합니다. 로그인과 회원가입 간에 비교해보세요.

Graham님의 프로필

Graham

질문자

2022.08.03

/front/actions/user.js

//회원가입
export const SIGN_UP = createAsyncThunk(
  'user/signup',
  async (data, { rejectWithValue }) => {
    try {
      const response = await axios.post('/user', data);
      return response.data;
    } catch (error) {
      return rejectWithValue(error.response.data);
    }
  }
);

//로그인
export const LOG_IN = createAsyncThunk(
  'user/login',
  async (data, { rejectWithValue }) => {
    try {
      const response = await axios.post('/user/login', data);
      return response.data;
    } catch (error) {
      return rejectWithValue(error.reponse.data);
    }
  }
);

회원가입, 로그인 거의 동일한 코드 입니다.

제가 놓치고 있는 부분이 있을까요?

잘 보시면 catch 부분에 오타가 있습니다.

Graham님의 프로필

Graham

질문자

2022.08.03

아... 민망하네요. 이런 초보적인 실수를... 앞으론 좀더 꼼꼼히 보겠습니다. 

정말 감사해요.