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

김수민님의 프로필 이미지
김수민

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

ERROR [ExceptionsHandler] request.isAuthenticated is not a function

작성

·

885

0

@UseGuards(new NotLoggedInGuard), @UseGuards(new LoggedInGuard) - 데코레이터를 회원가입과, 로그인에 각각 추가를 해주고 -> postman으로 회원가입, 로그인 할 시 에러가 발생합니다.

 

{
"statusCode": 500,
"message": "Internal server error"
}

[Nest] 6463  - 2022. 02. 03. 오후 4:28:14   ERROR [ExceptionsHandler] request.isAuthenticated is not a functionTypeError: request.isAuthenticated is not a function   

 

회원가입, 로그인 라우터에 @UseGuards 를 뺴고 실행 할 시 정상적으로 작동합니다.

not-logged-in.guard.ts, logged. 쪽 auth 폴더쪽을 아에 삭제하고 제로초님 완성본 slack 본 auth 파일을 그대로 가져와서 실행해봤는데 계속 똑같은 에러가 발생하는 거 같습니다.

왜 에러가 발생하는 것일까요.. 

또 신기한게 로그인 라우터 @UseGuards(LocalAuthGuard)는 정상적으로 동작하는 거 같습니다.

NotLogged, Logged 만 실행이 안되네요..

 

@ApiResponse({
status: 200,
description: '회원가입 성공',
type: UserDto
})
@ApiOperation({ summary: '회원가입' })
@UseGuards(new NotLoggedInGuard)
@Post()
async SignUpUser(@Body() body: JoinRequestDto) {
await this.userService.SignUpUser(body.email, body.nickname, body.password)
}
 
@ApiCookieAuth('connect.sid')
@ApiOperation({ summary: '로그아웃' })
@UseGuards(new LoggedInGuard)
@Post('logout')
async logout(@Response() res) {
res.clearCookie('connect.sid', { httpOnly: true });
return res.send('ok');
}

 

 

답변 2

1

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

main.ts에서도 passport 관련 코드 app.use로 등록하셔야 합니다. 그 부분 등록하셨나요?

김수민님의 프로필 이미지
김수민
질문자

네 추가 했습니다 

app.use(passport.initialize());
app.use(passport.session());
 
김수민님의 프로필 이미지
김수민
질문자

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import passport from 'passport';
import cookieParser from 'cookie-parser';
import session from 'express-session';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { HttpExceptionFilter } from './httpException.filter';
import { ValidationPipe } from '@nestjs/common';

declare const module: any;

async function bootstrap() {
const app = await NestFactory.create(AppModule);
const port = process.env.PORT || 3000;

app.useGlobalPipes(new ValidationPipe())
app.useGlobalFilters(new HttpExceptionFilter());

 
const config = new DocumentBuilder()
.setTitle('slack API')
.setDescription('slack API 문서 입니다.')
.setVersion('1.0')
.addCookieAuth('connect.sid')
.build();

const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);

await app.listen(port);
console.log(`Listening on port${port}`);

app.use(cookieParser());
app.use(
session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
},
}),
);
app.use(passport.initialize());
app.use(passport.session());

if (module.hot) {
module.hot.accept();
module.hot.dispose(() => app.close());
}
}
bootstrap();
김수민님의 프로필 이미지
김수민
질문자

@ApiCookieAuth('connect.sid')
@ApiOperation({ summary: '로그아웃' })
@UseGuards(new LoggedInGuard)
@Post('logout')
async logout(@Response() res) {
res.clearCookie('connect.sid', { httpOnly: true });
return res.send('ok');
}
@ApiResponse({
status: 200,
description: '회원가입 성공',
type: UserDto
})
@ApiOperation({ summary: '회원가입' })
@UseGuards(new NotLoggedInGuard)
@Post()
async SignUpUser(@Body() body: JoinRequestDto) {
await this.userService.SignUpUser(body.email, body.nickname, body.password)
}
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/main.ts

코드 순서도 일치해야 합니다.

김수민님의 프로필 이미지
김수민

작성한 질문수

질문하기