You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法配置Mailgun:求从数据库获取配置并解决Mongoose超时问题

解决Mailgun配置从数据库加载及Mongoose缓冲超时问题

核心问题分析

  1. 异步调用未正确处理:原代码调用configuration()时未用await,导致mg变量始终未被赋值就调用其方法。
  2. 数据库连接未就绪:查询配置时Mongoose还未完成数据库连接,触发缓冲超时错误。
  3. 发件邮箱未从数据库获取:mailgun_email变量未从数据库配置中读取。

解决方案代码

let mg;
let mailgunEmail; // 存储从数据库获取的发件邮箱

// 初始化Mailgun配置,确保数据库连接就绪后执行
const initMailgunConfig = async () => {
  // 等待Mongoose数据库连接完全建立
  await mongoose.connection.asPromise();
  
  const config = await Configuration.findById(process.env.CONFIGURATION_ID);
  if (!config) {
    throw new Error("未找到Mailgun配置记录");
  }
  
  // 初始化Mailgun客户端
  mg = mailgun.client({
    username: config.mailgun_username,
    key: config.mailgun_api_key,
  });
  // 存储发件邮箱
  mailgunEmail = config.mailgun_email;
};

// 应用启动时立即初始化配置,失败则退出进程
initMailgunConfig().catch(err => {
  console.error("Mailgun配置初始化失败:", err);
  process.exit(1);
});

const successOnRegisterMail = async (user_email, user_name) => {
  // 检查配置是否已初始化完成
  if (!mg || !mailgunEmail) {
    console.error("Mailgun配置未就绪,无法发送邮件");
    return;
  }
  
  try {
    const msg = await mg.messages.create(
      "sandbox1f0bc2b687fc416cbd9bdf7a7d1bc24c.mailgun.org",
      {
        from: mailgunEmail,
        to: [user_email],
        subject: "注册成功通知",
        text: "恭喜您注册成功!",
        html: `<p>Hello ${user_name}</p> <br /><br /> <p>恭喜您注册成功!</p><br /> 此致 <br /> 开发团队`,
      }
    );
    console.log("邮件发送成功:", msg);
  } catch (err) {
    console.log("邮件发送失败: ", err);
  }
};

关键修改说明

  • 提前初始化配置:在应用启动时执行initMailgunConfig,先等待数据库连接就绪(await mongoose.connection.asPromise()),再查询配置并初始化Mailgun客户端,彻底解决缓冲超时问题。
  • 正确处理异步逻辑:successOnRegisterMail改为异步函数,使用await确保邮件发送逻辑在配置就绪后执行。
  • 增加配置检查:发送邮件前先校验mg和mailgunEmail是否已赋值,避免未初始化导致的报错。
  • 错误兜底:初始化失败时直接退出进程,防止后续业务逻辑在配置缺失的情况下运行。

内容的提问来源于stack exchange,提问作者Narayan Maity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:44:55