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侧验证
- 要求服务商提供完整请求日志,包括来源IP、请求时间、请求头信息,确认Vercel的请求是否到达他们的服务器:
- 若无记录:说明请求未发出(代码或Vercel网络问题)
- 若有记录但被拒绝:根据返回的错误码排查(如凭证无效、格式错误)
- 确认账号是否存在地域限制(仅允许特定地区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
相关产品推荐
相关产品推荐

