Vercel、Netlify部署Serverless函数返回源码不执行如何解决
故障核心原因
两个平台出现相同的返回源码问题,本质是平台未识别到对应文件是可执行Serverless函数,直接将其作为静态文本资源返回。本地开发环境对函数格式容错度高,不会严格校验入口规范,因此会出现本地运行正常、线上部署失效的差异。
Vercel 平台修复方案
Vercel Node.js运行时对Serverless函数有强制入口规范,不符合要求就不会被识别为可执行函数:
- CommonJS规范下必须通过
module.exports导出处理函数,不要直接写业务逻辑、不做导出;如果项目根目录package.json已声明"type": "module",使用ES Module标准导出即可。 - CommonJS 正确写法参考(对应路径
/api/index.js):
module.exports = async (req, res) => { // 替换为实际业务逻辑 res.status(200).json({ success: true, data: "正常响应" }) }
- ES Module 正确写法参考:
export default async function handler(req, res) { // 替换为实际业务逻辑 res.status(200).json({ success: true, data: "正常响应" }) }
- 配置检查:确认
vercel.json中没有将/api目录配置为静态资源目录,也没有给对应接口路径配置指向静态文件的重写规则。
Netlify 平台修复方案
Netlify的函数签名规范和Vercel不通用,必须按平台要求导出名为handler的方法才会被识别:
- CommonJS规范下需要给exports对象挂载handler属性,ES Module规范下直接导出名为handler的常量/函数即可。
- CommonJS 正确写法参考(对应路径
/functions/tweet.js):
exports.handler = async (event, context) => { // 替换为实际业务逻辑 return { statusCode: 200, body: JSON.stringify({ success: true, data: "正常响应" }) } }
- ES Module 正确写法参考:
export const handler = async (event, context) => { // 替换为实际业务逻辑 return { statusCode: 200, body: JSON.stringify({ success: true, data: "正常响应" }) } }
- 配置检查:确认
netlify.toml中配置的functions目录和你实际存放函数的目录完全一致,没有配置规则将/functions路径下的文件作为静态资源发布。
通用排查项
修正入口写法后仍异常的,逐一核对以下配置:
- 函数文件无语法错误,所有依赖都已在
package.json中声明,部署阶段依赖安装无报错 - 平台路由/重写规则中,没有把对应接口路径指向静态资源目录
- 线上配置的Node.js运行时版本和本地开发版本大版本差不超过2,避免语法兼容问题导致函数加载失败
内容的提问来源于stack exchange,提问作者Probably Arth
相关产品推荐
相关产品推荐

