async/await函数未等待sendSMS响应,返回undefined求助
问题根源
你的sendSMS函数虽然声明为async,但内部没有返回fetch发起的Promise链,导致函数执行后直接返回undefined。当POST函数里await sendSMS(...)时,其实是在等待一个undefined,所以会立刻执行后续的console.log('res from sendSMS', SMSSent),此时SMSSent就是undefined。而fetch的异步请求是在之后才完成,所以相关日志会滞后打印。
另外,sendSMS内部的返回逻辑不统一:成功场景错误地返回了{ error: "Une erreur s'est produite" },失败场景有的返回字符串、有的返回带error的对象,这会导致后续判断逻辑混乱。
修复方案
1. 修改sendSMS函数,返回Promise并统一返回格式
把fetch的调用返回出去,同时调整返回值逻辑,让成功和失败的返回格式一致:
export default async function sendSMS(phoneNumber, body) { const options = { method: "POST", headers: { accept: "application/json", "content-type": "application/json", "api-key": process.env.BREVO_API_KEY }, body: JSON.stringify({ sender: "maillart", recipient: phoneNumber, content: body, type: "transactional", unicodeEnabled: false, tag: "accountValidation", }), }; // 关键:返回fetch的Promise链,改用try/catch适配async/await写法 try { const response = await fetch("https://api.brevo.com/v3/transactionalSMS/sms", options); const data = await response.json(); console.log("-------res is coming--------", data); // 接口返回错误(比如参数无效) if (data.message) { console.log("-------------------------SMS not sent1-------------------------------", data.message); // 统一返回带error的对象 return { error: data.message }; } // SMS发送成功 console.log("-------------------------SMS sent-------------------------------"); return { success: true }; } catch (err) { console.log("-------------------------SMS not sent2-------------------------------"); console.log("erreur ::", err); return { error: "Une erreur s'est produite" }; } }
2. 调整POST函数的判断逻辑
因为现在sendSMS统一返回带error或success的对象,所以可以更清晰地判断:
export async function POST(req) { // ... 省略其他前置代码 const SMSSent = await sendSMS(phoneToSendSMS, bodyToSend) console.log('res from sendSMS', SMSSent); if (SMSSent?.error) { await prisma.token.delete({ where: { id: res.tokenId, // 确保此处的res是你之前正确定义的变量 }, }); console.log('-------------error sending SMS Token deleted---------------------'); return new NextResponse(JSON.stringify({ error: SMSSent.error }), { status: 422 }); } // 发送成功返回200 return new NextResponse(JSON.stringify({ message: "Un SMS a été envoyé sur votre téléphone" }), { status: 200 }); }
注意:检查POST函数里的res.tokenId,确保res是你之前正确定义的变量(比如从prisma查询得到的结果),避免出现未定义的错误。
验证修复效果
修改后,POST函数会等待sendSMS的Promise完成后再执行后续代码,日志会按顺序打印:
- 先打印
-------res is coming--------相关内容 - 再打印
res from sendSMS { ... } - 然后根据结果执行删除token或返回成功响应的逻辑
内容的提问来源于stack exchange,提问作者EtwinCorp
相关产品推荐
相关产品推荐

