【问题标题】:Error thrown by a class method is not catched by a request handler类方法抛出的错误未被请求处理程序捕获
【发布时间】:2021-12-29 10:20:42
【问题描述】:

我创建了一个传输类来发送电子邮件:

export class MailTransporter {
  receiver: string;
  private transporter: Transporter;

  constructor(receiver: string) {
    this.receiver = receiver;
    this.transporter = this.getTransporter();
  }

  private getTransporter() {
    const { MAIL_USERNAME: user, MAIL_PASSWORD: pass, MAIL_HOST: host, MAIL_PORT: port } = process.env;

    if (!user || !pass || !host || port) {
      // NEXT LINE THROWS AN ERROR
      throw new Error('Specify MAIL_USERNAME, MAIL_PASSWORD, MAIL_HOST and MAIL_PORT in .env');
    }

    const transporter = nodemailer.createTransport({
      host,
      port: Number(port),
      secure: true,
      auth: {
        user,
        pass,
      },
    });

    return transporter;
  }

  public async sendMail(formValues: string) {
    const values: FormValues = JSON.parse(formValues);
    const message: SendMailOptions = {...};

    await this.transporter.sendMail(message, (err, info) => {
      if (err) {
        throw err;
      }

      console.log('Email successfully sent. Info:\n', info);
    });
  }
}

并从handler 函数中调用sendMail 函数:

export default async function Handler(req: NextApiRequest, res: NextApiResponse) {
  const { body } = req;

  try {
    const response = await MessageTransporter.sendMail(body); //MessageTransporter is an instance of MailTransporter

    res.status(200).json({ success: true, message: 'OK' });
  } catch (error) {
    res.json({ success: false, message: 'Could not send the message' });
  }
}

但是MailTransporter 中抛出的错误没有在Handler 中捕获,而是在我的控制台 中收到错误
在我的浏览器中,我的 POST 请求出现 500 错误。

你能解释一下那里发生了什么吗?为什么在handlertry catch 中没有捕获到错误?

另外,我对 js 类有点陌生,所以如果你对类设计有什么要说的,请说。

【问题讨论】:

  • 无论实例是构造,都会引发该错误,而这不是您所显示的。
  • getTransporter 的调用在MailTransporter 的构造函数中,因此您应该在为MessageTransporter 创建实例的调用站点上检查它。
  • 啊,我在实例构造中调用 getTransporter。说得通。感谢你们。 @NalinRanjan 如果你留下一个,我会接受你的回答

标签: javascript typescript error-handling


【解决方案1】:

getTransporter 的调用位于MailTransporter 的构造函数中,因此您应该在创建MessageTransporter 实例的调用站点上对其进行检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2023-03-28
    • 2019-05-19
    相关资源
    最近更新 更多