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

NextJs 14部署Vercel后无法通过SMS Portal发送SMS求助

排查思路与解决方案

一、代码层面修复

1. 异步逻辑错误(核心问题)

你的sendSms声明为async函数,但内部使用.then/.catch却未返回Promise,导致Vercel Serverless Function可能在请求发起前就提前终止,根本没向SMS Portal发送请求。

修正后的代码(改用async/await并确保错误可追踪):

import axios from "axios";

export const sendSms = async (message: string, recipient: string) => {
  // 先校验环境变量是否存在
  const apiKey = process.env.SMS_PORTAL_CLIENT_ID;
  const apiSecret = process.env.SMS_PORTAL_API_SECRET;
  if (!apiKey || !apiSecret) {
    console.error("[SMS Error] 缺少API凭证");
    throw new Error("SMS配置未完成");
  }

  const base64Credentials = Buffer.from(`${apiKey}:${apiSecret}`).toString("base64");

  try {
    // 无需手动JSON.stringify,axios会自动处理JSON请求体
    const response = await axios.post(
      "https://rest.smsportal.com/bulkmessages",
      {
        messages: [
          {
            content: message,
            destination: recipient,
          },
        ],
      },
      {
        headers: {
          Authorization: `Basic ${base64Credentials}`,
          "Content-Type": "application/json",
        },
      }
    );
    console.log("[SMS Success]", response.data);
    return response.data;
  } catch (error) {
    // 精准捕获axios错误,便于排查
    if (axios.isAxiosError(error)) {
      console.error("[SMS Failure]", error.response?.data || error.message);
    } else {
      console.error("[SMS Network Error]", error);
    }
    // 抛出错误让Vercel日志系统捕获
    throw error;
  }
};

2. 环境变量验证

  • 登录Vercel控制台,进入项目 → Settings → Environment Variables
  • 确认SMS_PORTAL_CLIENT_ID和SMS_PORTAL_API_SECRET已添加,且Production环境的勾选框已启用
  • 可以在代码中添加日志(不要打印完整凭证)验证变量是否加载成功:
    console.log("API Key存在:", !!apiKey);
    console.log("API Secret存在:", !!apiSecret);
    

二、Vercel网络与IP配置

1. IP白名单设置

Vercel Serverless Functions的出站IP是动态的,专业版支持固定出站IP,或需要将Vercel的IP段添加到SMS Portal白名单:

  • 在Vercel控制台 → Settings → Network → Outbound IPs 查看当前项目的出站IP范围
  • 将这些IP段提供给SMS Portal服务商,添加到他们的访问白名单中
  • 若使用专业版固定IP功能,需在项目网络设置中启用,再将固定IP提交给服务商

2. 函数日志排查

  • 进入Vercel控制台 → Functions → 找到处理SMS发送的函数(比如API Route)
  • 查看Logs标签,检查是否有被忽略的网络错误、超时或权限问题

三、SMS Portal侧验证

  1. 要求服务商提供完整请求日志,包括来源IP、请求时间、请求头信息,确认Vercel的请求是否到达他们的服务器:
    • 若无记录:说明请求未发出(代码或Vercel网络问题)
    • 若有记录但被拒绝:根据返回的错误码排查(如凭证无效、格式错误)
  2. 确认账号是否存在地域限制(仅允许特定地区IP访问)或API权限限制(禁止云服务商IP调用)

四、Vercel函数配置优化

1. 延长超时时间

Serverless Function默认超时可能不足以完成SMS请求,在项目根目录创建vercel.json:

{
  "functions": {
    "app/api/**/*.{js,ts}": {
      "timeout": 10
    }
  }
}

将超时调整为10秒(根据实际需求调整)

2. 确保后端调用

不要在前端组件直接调用sendSms,将逻辑放在API Route或Server Component中,避免前端跨域或暴露凭证问题


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:53:11