电商应用支付后发邮件报错:mailgun.messages is not a function求解决
解决"mailgun.messages is not a function"错误及其他Mailgun API使用方式
错误原因
你在utils.js中导出的mailgun是一个返回Mailgun实例的函数,而非直接的实例对象。在orderRoutes.js中直接调用mailgun.messages()时,相当于在调用这个函数的messages方法,但函数本身并没有这个方法,因此抛出错误。
快速修复方案
方案1:修改调用方式(推荐,保持原utils.js结构)
在orderRoutes.js中,先执行mailgun()获取实例,再调用messages().send():
// 替换原mailgun.messages().send(...)部分 mailgun().messages().send( { from: "Sales <sales@cocoTiCosmetics.com>", to: `${order.user.firstName} <${order.user.email}>`, subject: `New Order ${order._id}`, html: payOrderEmailTemplate(order), }, (error, body) => { if (error) { console.log(error); } else { console.log(body); } } );
方案2:修改utils.js的导出方式
直接在utils.js中创建并导出Mailgun实例,无需包裹函数:
// utils.js修改后 export const mailgun = mg({ apiKey: process.env.MAILGUN_API_KEY, domain: process.env.MAILGUN_DOMAIN, });
这样orderRoutes.js中原来的mailgun.messages().send()调用就可以正常工作了。
其他使用Mailgun API的方式
方式1:使用Mailgun SDK的Promise语法(贴合async/await风格)
Mailgun SDK支持Promise,用async/await替代回调函数,代码更简洁:
// 确保mailgun是实例(按方案2修改utils.js后) try { const body = await mailgun.messages().send({ from: "Sales <sales@cocoTiCosmetics.com>", to: `${order.user.firstName} <${order.user.email}>`, subject: `New Order ${order._id}`, html: payOrderEmailTemplate(order), }); console.log(body); } catch (error) { console.log(error); }
方式2:直接发送HTTP请求(不依赖SDK)
如果不想用SDK,可以直接通过fetch调用Mailgun的REST API:
const apiKey = process.env.MAILGUN_API_KEY; const domain = process.env.MAILGUN_DOMAIN; const auth = `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`; try { const response = await fetch(`https://api.mailgun.net/v3/${domain}/messages`, { method: 'POST', headers: { 'Authorization': auth, 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ from: "Sales <sales@cocoTiCosmetics.com>", to: `${order.user.firstName} <${order.user.email}>`, subject: `New Order ${order._id}`, html: payOrderEmailTemplate(order), }), }); const data = await response.json(); console.log(data); } catch (error) { console.log(error); }
内容的提问来源于stack exchange,提问作者Cyan the Computer Scientist
相关产品推荐
相关产品推荐

