Next.js调用Amazon SES发信出现API未返回响应报错如何解决
问题根因
你遇到的报错本质是两个异步逻辑处理问题共同导致的:
- Next.js API 路由要求所有请求必须明确返回响应,你现有代码的handler函数全程没有调用
res对象的返回方法,逻辑执行完成后没有给客户端返回任何结果,就会触发API resolved without sending a response的提示。 sendMail函数内部是异步调用AWS SES接口,但是没有将异步Promise返回,外层路由无法感知到发信操作还在执行,同步代码跑完就直接结束了请求上下文,甚至可能出现发信逻辑还没执行完就被中断的情况。
修复方案
1. 修改sendmail.js
调整函数逻辑,直接返回SES发信的Promise,不用单独定义result变量承接结果:
var AWS = require('aws-sdk'); AWS.config.update({ region: process.env.AWS_REGION }); function sendMail(Email) { var params = { Destination: { CcAddresses: [Email], ToAddresses: [Email] }, Message: { Body: { Html: { Charset: "UTF-8", Data: "HTML_FORMAT_BODY" }, Text: { Charset: "UTF-8", Data: "TEXT_FORMAT_BODY" } }, Subject: { Charset: 'UTF-8', Data: 'Test email' } }, Source: 'abc@gmail.com', ReplyToAddresses: ['abc12@gmail.com'], }; // 直接返回Promise,外层可以等待执行结果 return new AWS.SES({ apiVersion: '2010-12-01' }).sendEmail(params).promise(); } export default sendMail;
2. 修改dynamicid.js
将路由处理函数改为async异步函数,等待所有异步操作完成后明确返回响应,报错场景也要返回错误提示:
import { getDataFromSheets } from '../../../libs/sheets'; import sendmail from '../../../libs/ses/sendmail'; export default async function handler(req, res) { try { const sheet = await getDataFromSheets(); // 批量发信用Promise.all等待所有发信请求完成 const sendTasks = sheet.slice(1).map(item => sendmail(item.Email)); await Promise.all(sendTasks); // 明确返回成功响应 return res.status(200).json({ status: 'success', message: '所有邮件已发送完成' }); } catch (err) { console.error(err); // 错误场景也要返回响应 return res.status(500).json({ status: 'fail', message: '操作失败', error: err.message }); } }
额外注意事项
- 如果你还在AWS SES沙箱环境中,发件地址
abc@gmail.com和所有收件地址都需要提前在SES控制台完成验证,否则会触发发信失败。 - 确保Next.js项目已经正确配置
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION三个环境变量,对应账号拥有SES发信权限。 - 如果收件人数量较多,建议调用SES批量发信接口或者添加请求限流,避免触发AWS的接口调用频率限制。
内容的提问来源于stack exchange,提问作者Monu Patil
相关产品推荐
相关产品推荐

