(최종 프로젝트 진행중)
한 일:
- queryBuilder 문서 보던중. 두 번 조인과 그 때 select하는 법, (https://typeorm.io/select-query-builder#join-without-selection)
- 그렇게 가져온 ‘정재된 결과물’을 partial 타입으로 넘겨서 테스트 할 것인지… 그렇다면 어떻게.. …?
- 테스트 코드 강의 노트와 유튜브 보던 중
(나중에 볼 만한 것)
- 로그인 e2e. jwt토큰 검증으로 HttpStatus.FORBIDDEN에서 OK로 만들기
- Express 방식으로 (req, res, next) 소스 코드와 테스트 코드 쓰기 (도움이 될까..?)
- IsCreateorGuard라는.. 게.. 있어서..?! ‘로그인 유저가 작성자인지 검사’
- Nest.js 파일 업로드 테스트하는 방법
무슨 stream으로 Unit Test 코드 만들기 - https://stackoverflow.com/questions/67377812/mock-file-upload-in-unit-test-controller-nestjs
PostMan의 form-data와 ‘select files’버튼(?)’을 이용해 테스트하기 - https://stackoverflow.com/questions/61148959/fileinterceptor-and-body-issue-in-nestjs-upload-a-file-and-data-in-a-request
Nest.js 홈페이지에서 소개하는 터미널 명령어 방법
https://github.com/nestjs/nest/tree/master/sample/29-file-upload
- [Nest.js] Sample 코드 일체 (auth-jwt, file-upload 등. 별로 혹할 만한 건 없음)
- NodeMailer 블로그 포스팅
- 쪽지 기능 구현하기
※ 이하는 스스로 공부하며 적어둔 노트이며 불확실한 내용이 있을 수 있습니다. 학습용으로 적합하지 않음을 유념해주세요. ※
[Nest.js] 에러 TypeError: Cannot read properties of undefined (reading 'name') ✔️
[Nest.js] 에러 TypeError: Cannot read properties of undefined (reading 'name') ✔️
발생 상황: pull을 받고 Nest.js 애플리케이션 서버를 실행해보려는데 발생.
에러 메세지 전문:
[오후 4:27:33] Starting compilation in watch mode...
[오후 4:27:42] Found 0 errors. Watching for file changes.
[Nest] 19260 - 2023. 03. 12. 오후 4:27:46 LOG [NestFactory] Starting Nest application...
[Nest] 19260 - 2023. 03. 12. 오후 4:27:46 ERROR [ExceptionHandler] Cannot read properties of undefined (reading 'name')
TypeError: Cannot read properties of undefined (reading 'name')
at new DataSource (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\src\data-source\DataSource.ts:130:29)
at Injector.instantiateClass (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\injector.js:351:19)
at callback (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\injector.js:56:45)
at Injector.resolveConstructorParams (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\injector.js:136:24) at Injector.loadInstance (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\injector.js:61:13)
at Injector.loadProvider (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\injector.js:88:9)
at C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\instance-loader.js:49:13
at async Promise.all (index 0)
at InstanceLoader.createInstancesOfProviders (C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\instance-loader.js:48:9)
at C:\Users\USER\Desktop\Sparta\05_project_무인냥품\node_modules\@nestjs\core\injector\instance-loader.js:33:13
시도:
이상한 것은 내 프로젝트 폴더의 src폴더 안에는 저 data-source라는 경로가 없다는 것이다… 에러 메세지를 읽어봐도 찾아가서 고쳐볼만한 유효한 경로가 나오지 않고 다 node_module의 코드들이다.
더 이상한 것은 받아온 코드가 깃헙에서 DI 테스트를 (그것도 Node 버전별로) 통과했다는 것이다… 나한테 와서 이상해졌다는 건가?
아무리 찾아봐도 레퍼런스가 안 나왔다.
DataSource로 그냥 파일 검색하고 셀프 추론으로 해결하였다… 허허….
원인:
해결: messages.module.ts에서 imports되는 DataSource를 삭제하였더니 서버가 다시 잘 켜졌다.
// src/messages/messages.module.ts
...
import { DataSource } from 'typeorm';
import { Message } from './message.entity';
@Module({
imports: [TypeOrmModule.forFeature([Message]), DataSource],
controllers: [MessagesController],
providers: [MessagesService, MessagesRepository],
})
export class MessagesModule {}
[Nest.js] req.user를 기어코 인식하지 못할 때 ✔️
[Nest.js] req.user를 기어코 인식하지 못할 때 ✔️
messages.controller.ts를 작성하는데, 옆집 requests 모듈의 controller에서와 정확히 똑같이 @Req() req를 임포트해주고 사용하는데도 req.user가 undefined로 떴었다.
이렇게 정말 이상하게 req.user를 도무지 인식하지 못할 때는 app.module에 문제가 있는 것이다.
⇒ app.module에 authMiddleware 경로 설정을 추가해줬는지 체크하기:
// app.module.ts
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useClass: TypeOrmConfigService,
inject: [ConfigService],
}),
JwtModule.registerAsync({
imports: [ConfigModule],
useClass: JwtConfigService,
inject: [ConfigService],
}),
UsersModule,
...
],
controllers: [AppController],
providers: [AppService, AuthMiddleware],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware)
.forRoutes(
{ path: 'auth/logout', method: RequestMethod.ALL },
{ path: 'messages', method: RequestMethod.POST },
{ path: 'messages/sent', method: RequestMethod.GET },
{ path: 'messages/received', method: RequestMethod.GET },
);
}
}
[TypeORM] 두 번 조인과 select 하기 ✔️
[TypeORM] 두 번 조인과 select 하기 ✔️
async getSentMessages(senderId: number): Promise<Partial<Message>[]> {
const messages = await this.createQueryBuilder('m')
.leftJoin('m.send_user', 'sender')
.leftJoin('m.receive_user', 'receiver')
.addSelect(['sender.nickname', 'receiver.nickname'])
.where('m.sender_id = :senderId', { senderId })
.getMany();
return messages;
}
⇒ 일단 select()가 하나도 없으면 기본적으로 m (Message)의 모든 컬럼 선택
⇒ 설명 생략. 어쨌든 잘 됨을 확인했다.
Uploaded by N2T