Ошибка отправки в Nest
Сеть или удалённый сервер иногда недоступны в момент отправки. Если ошибку не обработать, страница может оборваться непонятным сообщением, а клиент не узнает, что письмо не ушло.
Вызов sendMail оборачивают
в try и catch.
При сбое транспорта сервис
не пробрасывает исключение
наверх, а возвращает короткую
фразу, которую контроллер
отдаёт как обычный ответ.
Для примера укажем недостижимый
хост в transport, чтобы
увидеть отказ без реальной
почты.
Покажем на примере постов:
import { Module } from '@nestjs/common';
import { MailerModule } from '@nestjs-modules/mailer';
import { PostController } from './post.controller.js';
import { PostService } from './post.service.js';
@Module({
imports: [
MailerModule.forRoot({
transport: {
host: '127.0.0.1',
port: 1,
connectionTimeout: 300,
},
defaults: {
from: '"Posts" <posts@app.test>',
},
}),
],
controllers: [PostController],
providers: [PostService],
})
export class AppModule {}
Сервис перехватит сбой и вернёт короткий текст:
import { Injectable } from '@nestjs/common';
import { MailerService } from '@nestjs-modules/mailer';
@Injectable()
export class PostService {
mailerService: MailerService;
constructor(mailerService: MailerService) {
this.mailerService = mailerService;
}
async sendSafe(to: string, subject: string) {
try {
await this.mailerService.sendMail({
to,
subject,
text: 'Материал опубликован.',
});
return 'Письмо отправлено';
} catch {
return 'Письмо не отправилось';
}
}
}
Контроллер отдаст клиенту строку из сервиса:
import { Body, Controller, Post } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller('posts')
export class PostController {
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Post('mail')
sendMail(
@Body('to') to: string,
@Body('subject') subject: string,
) {
return this.postService.sendSafe(to, subject);
}
}
Оберните отправку в
WorkerService
в перехват сбоя и верните
клиенту через
WorkerController
короткую фразу о неудаче.