TypeError: Cannot read properties of undefined (reading 'sendMail') Express TS

Рейтинг: -2Ответов: 1Опубликовано: 19.04.2023
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Принят

Не знаю зачем вы перемешали статичные методы и методы экземпляра, но если так и должно быть то проблема, скорее всего, в том, что 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>`,
    });
  }
}