TypeError: Cannot read properties of undefined (reading 'sendMail') Express TS
import * as nodemailer from 'nodemailer'
export class MailService {
private static transporter: nodemailer.Transporter;
private transporter: nodemailer.Transporter;
constructor(){
this.transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth:{
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASSWORD
}
})
}
public static async sendActivationMail(to:any, link:any){
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: 'Активация аккаунта на ' + process.env.API_URL,
text: '',
html:
`<div>
<h1>Для активации перейдите по ссылке </h1>
<a href="${link}">${link}</a>
</div>
`
})
}
async sendActivationPasswordMail(to:string, link:string){
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: 'Смена пароля на ' + process.env.API_URL,
text: '',
html:
`<div>
<h1>Для смены перейдите по ссылке </h1>
<a href="${link}">${link}</a>
</div>
`
})
}
async sendActivationWelcomeLink(to:string, link:string, title:string){
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: `Приглашение на курс ${title} на ${process.env.API_URL}`,
text: '',
html:
`<div>
<h1>Чтобы вступить на курс перейдите по ссылке: </h1>
<a href="${link}">${link}</a>
</div>
`
})
}
}
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
Не знаю зачем вы перемешали статичные методы и методы экземпляра, но если так и должно быть то проблема, скорее всего, в том, что this.transporter инициализируется только в конструкторе, а используется и в public static async sendActivationMail.
Если сохранять вашу логику класса MailService, ваша проблема решается инициализацией private static transporter и созданием геттера private get transporter:
import * as nodemailer from 'nodemailer';
export class MailService {
private static transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASSWORD,
},
});
private get transporter() {
return MailService.transporter;
}
static async sendActivationMail(to: string, link: string) {
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: 'Активация аккаунта на ' + process.env.API_URL,
html: `<div>
<h1>Для активации перейдите по ссылке </h1>
<a href="${link}">${link}</a>
</div>`,
});
}
async sendActivationPasswordMail(to: string, link: string) {
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: 'Смена пароля на ' + process.env.API_URL,
html: `<div>
<h1>Для смены перейдите по ссылке </h1>
<a href="${link}">${link}</a>
</div>`,
});
}
async sendActivationWelcomeLink(to: string, link: string, title: string) {
await this.transporter.sendMail({
from: process.env.SMTP_USER,
to,
subject: `Приглашение на курс ${title} на ${process.env.API_URL}`,
html: `<div>
<h1>Чтобы вступить на курс перейдите по ссылке: </h1>
<a href="${link}">${link}</a>
</div>`,
});
}
}