[Node.js] nodemailer Redis 사용
2024. 6. 20. 21:07ㆍNode.js
728x90
반응형
내일배움캠프 백오피스 프로젝트중에 이메일인증기능을 위해 nodemailer와 Redis를 사용하였습니다 Redis를 사용하는 이유는 이메일인증코드가 휘발성으로 데이터베이스에 계속 저장이되면 불필요한 데이터가 누적이 되기 때문에 Redis를 사용하였습니다.
저는 Redis 데이터베이스를 무료로 제공하는 https://app.redislabs.com/#/ 에서 생성하여 사용하였습니다.
import redis from 'redis';
import { ENV_KEY } from '../constants/env.constants.js';
const redisClient = redis.createClient({
url: `redis://${ENV_KEY.REDIS_USER_NAME}:${ENV_KEY.REDIS_PASSWORD}@${ENV_KEY.REDIS_HOST}:${ENV_KEY.REDIS_PORT}/0`,
password: ENV_KEY.REDIS_PASSWORD,
legacyMode: true,
});
redisClient.on('connect', () => {
console.info('Redis 연결에 성공했습니다.');
});
redisClient.on('error', (err) => {
console.error('Redis 연결에 실패하였습니다.', err);
});
redisClient
.connect()
.then(() => {
console.info('Redis v4 연결에 성공했습니다.');
})
.catch((err) => {
console.error('Redis v4 연결에 실패했습니다.', err);
});
const redisCli = redisClient.v4
export { redisCli };
redis에 서버를 설정을 해야하기에 utlis에 작성을 해줍니다. redisClient에 들어가는 url 환경변수 값은 무료로 제공하는 사이트에 데이터베이스를 생성하면 값을 가져올수있습니다.
async sendVerificationEmail({ email, role }) {
const user = await this.authRepository.findByEmailAndRole({
email,
role,
});
if (user) {
throw new HttpError.BadRequest('이미 가입된 이메일입니다.');
}
const emailCode = generateRandomCode();
const key = `${email}:${role}`;
await redisCli.set(key, emailCode, { EX: 200 });
const mailOptions = {
to: email,
subject: '배달 서비스 이메일 인증번호 발송',
html: ` 인증번호: <strong>${emailCode}</strong>`,
};
this.transporter.sendMail(mailOptions);
}
verifyEmail = async ({ email, emailCode, role }) => {
const key = `${email}:${role}`;
const data = await redisCli.get(key);
if (!data) {
throw new HttpError.BadRequest('인증코드가 만료되었습니다.');
}
if (data !== emailCode) {
throw new HttpError.BadRequest('인증코드가 유효하지 않습니다.');
}
await redisCli.del(key);
};
nodemailer를 사용하여 인증코드를 랜덤으로 생성하여 인증코드를 메일로 전송하는 코드입니다. 여기서 rediscli를 사용하는 명령어를 보셔야합니다.
기본 명령어
- SET key vlaue
- GET key
- DEL key
- EXISTS key
- EXPIRE key seconds
728x90
반응형
'Node.js' 카테고리의 다른 글
[Node.js] GitHub Actions 인스턴스 세팅 (0) | 2024.07.09 |
---|---|
[Node.js] github Actions CI/CD (2) | 2024.07.08 |
[Node.js] 테스트코드란?? (0) | 2024.06.13 |
[Node.js] ReferenceError: prototype is not defined 에러 (0) | 2024.06.04 |
[Node.js] passport naver 로그인 (1) | 2024.06.03 |