15:20 광주에서 수원 도착
오늘 참여 못한 발표 피드백 보완점 고민하기
백엔드 서버 기초 기능 추가 구현하기
AI 엔드포인트에서 스토리 생성 시, 스토리는 생성되나 book은 생성되지 않음.
로컬에서는 정상적으로 작동하나, fly 배포판에서 문제 발생
2024-01-22T10:33:16.237 app[91852e32c70798] nrt [info] Error uploading buffer to S3: Error: Region is missing
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] /app/src/storages/storages.service.ts:63
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] throw new Error('Buffer upload failed');
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] ^
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] Error: Buffer upload failed
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] at StoragesService.bufferUploadToS3 (/app/src/storages/storages.service.ts:63:13)
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] at processTicksAndRejections (node:internal/process/task_queues:95:5)
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] at /app/src/ai/ai.service.ts:113:24
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] at async Promise.all (index 0)
2024-01-22T10:33:16.250 app[91852e32c70798] nrt [info] at AiService.createStorybook (/app/src/ai/ai.service.ts:123:21)
해결
s3관련 환경변수가 fly에 설정되지 않았던 것!
노드 버전은 생각보다 중요했다.
버전이 맞지 않으면 에러 메시지도 달라지고, 패키지가 하나라도 작동하지 않으면 전체 코드가 빌드되지 않는다.
nvm 기본적인 명령어 익히기
RDB에서는 데이터 삭제 시 delete옵션을 줌.
예를 들어 cascade는 해당 컬럼 삭제 시 연관 컬럼도 같이 상속 받아서 삭제하는 것.
mongodb는 외래키 관계가 존재하지 않기 때문에 기본적으로 delete 옵션은 없음.
이걸 어플리케이션 레벨이나, 미들웨어 레벨에서 설정해 줘야 함.
현재 코드는 story와 book이 연관되어 있는데, book을 삭제하면 story가 미아가 되어 버림.
따라서 book을 삭제하면 연관된 story도 자동으로 삭제가 되어야 함.
이걸 미들웨어 단에서 구현해 본다.
// 설치 가능 버전 확인
nvm ls-remote
// 특정 버전 설치
nvm install <version>
// 설치된 목록
nvm ls
// 특정 버전 사용
nvm use <version>
// 현재 노드 버전 확인
node --version
(nvm current)
// 기본 노드 바꾸기
nvm alias default <version>
회원가입 환영, 비밀번호 찾기 등에 활용할 이메일 SMTP 기능 구현 정보 찾아보기
SMTP는 Simple Mail Transfer Protocol의 약자입니다. 인터넷을 통해 이메일 메시지를 보내고 받는 데 사용되는 통신 프로토콜입니다. 메일 서버 및 기타 메시지 전송 에이전트(MTA)는 SMTP를 사용하여 메일 메시지를 보내고, 받고, 중계합니다.
이건 볼 때마다 헷갈림.
A모듈의 서비스를 B모듈에서 사용하려면 A모듈 파일의 exports에 A Service를 명시해야 함.
import * as nodemailer from 'nodemailer';
import { Injectable } from '@nestjs/common';
@Injectable()
export class MailService {
private trnaspoter: nodemailer.Transporter;
constructor() {
this.trnaspoter = nodemailer.createTransport({
service: 'gmail',
host: 'smtp.gmail.com',
port: 587,
secure: false,
// requireTLS: true,
auth: {
user: process.env.MAIL_USER,
pass: process.env.MAIL_PASS,
},
});
}
async sendMail(to: string, subject: string, html: string) {
const mailOptions = {
from: process.env.MAIL_USER,
to,
subject,
html,
};
await this.trnaspoter.sendMail(mailOptions);
}
}
성공! 근데 스팸으로 빠짐. 아마 메일 본문이 문제?
async sendMail(to: string, subject: string, html: string) {
const mailOptions = {
from: process.env.MAIL_USER,
to,
subject,
html,
};
await this.trnaspoter.sendMail(mailOptions);
}
async sendWelcomeMail(to: string, username: string) {
const subject = `[스토리파이] ${username}님, 환영합니다!`;
const html = `
<div>
<h1>Welcome ${username}</h1>
<p>Thank you for joining us!</p>
</div>
`;
await this.sendMail(to, subject, html);
}
메일을 보내는 기본적인 기능과, 특정 템플릿의 메일 발송을 분리
readonly가 없으면 다른 곳에서 의존성 변경이 가능
readonly가 있으면 최초 생성 외에 변경이 불가능
따라서 안정성 올라감
export class AuthService {
constructor(
private readonly userMongoRepository: UserMongoRepository,
private readonly jwtService: JwtService,
private readonly configService: ConfigService,
private readonly mailService: MailService,
) {}
스웨거의 프로퍼티가 자동으로 생성되지 않아서 임시 처리
// 데코레이터 줄이는 리팩토링 필요
@ApiBody({
schema: {
type: 'object',
properties: { email: { type: 'string', format: 'email' } },
},
})
@Post('forgot-password')
async forgotPassword(@Body('email') email: string) {
return await this.authService.forgotPassword(email);
}
자동으로 처리하려면 DTO를 쓰면 된다고 함.
이건 내일 처리!