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

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完成后再执行后续代码,日志会按顺序打印:

  1. 先打印-------res is coming--------相关内容
  2. 再打印res from sendSMS { ... }
  3. 然后根据结果执行删除token或返回成功响应的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:42:49