一、Vercel & Neon 核心介绍
1. Vercel 是什么
Vercel 是前端/后端一体化Serverless部署平台,由Next.js团队开发,主打「Git驱动、自动部署、全球CDN、零配置扩缩容」。
- 核心优势:
-
- 支持Node.js/Express/Nest/Next.js等后端框架,自动识别技术栈;
- 每个PR自动生成预览域名,便于测试;
- 只读文件系统(Serverless特性),函数执行完自动销毁;
- 免费额度足够个人/小型项目使用。
2. Neon 是什么
Neon 是Serverless PostgreSQL云服务,主打「按需计费、自动扩缩容、Scale-to-Zero(闲置归零)、毫秒级分支创建」。
- 核心优势:
-
- 完全兼容Postgres,支持所有原生语法/扩展;
- 连接池内置,适配Vercel Serverless函数(避免连接风暴);
- 免费版:3GB存储、无限计算时间、自动备份;
- 支持「数据库分支」,预览环境自动隔离数据。
二、实战前置准备
- 账号:Vercel账号(绑定GitHub)、Neon账号(可邮箱注册);
- 代码:Node.js后端(Express/Nest均可),示例用Express+Sequelize;
- 工具:Vercel CLI(可选,本地调试用)、Postman(接口测试)。
三、第一步:Neon 创建Postgres数据库(2种方式)
方式A:Neon控制台手动创建(推荐新手)
- 登录
console.neon.tech,点击「New Project」; - 配置:
-
- Project Name:自定义(如
vercel-backend-db); - Region:选US East(N. Virginia) (离Vercel最近,延迟最低);
- Postgres Version:16(最新稳定版);
- Project Name:自定义(如
- 点击「Create Project」,10秒内创建完成;
- 获取连接字符串(关键!):
-
- 进入「Connection Details」→ 选「Pooled Connection」(必须用Pooled,适配Serverless);
- 复制连接字符串,格式:
postgresql://user:password@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require
-
- 保存备用(后续Vercel环境变量要用)。
方式B:Vercel Marketplace 一键集成(推荐自动化)
- Vercel控制台 → 进入项目 → 「Storage」→ 「Create Database」→ 选「Postgres(Neon)」;
- 授权Neon账号,选择「Create New Neon Account」;
- 配置区域/数据库名,自动创建并注入环境变量(
DATABASE_URL等); - 优势:无需手动复制连接串,Vercel自动同步,支持「预览分支自动创建Neon分支」。
四、第二步:Vercel 部署Node.js后端(以Express为例)
1. 后端代码结构(标准Serverless结构)
backend/
├── src/
│ ├── config/
│ │ └── database.js # Sequelize配置
│ ├── routes/
│ │ └── test.js # 测试接口
│ └── app.js # 入口文件
├── .env # 本地环境变量(Neon连接串)
├── vercel.json # Vercel部署配置(必配)
└── package.json
2. 关键文件配置
(1)vercel.json(核心!配置Serverless入口)
{
"version": 2,
"builds": [
{
"src": "src/app.js", // 入口文件
"use": "@vercel/node" // 用Node.js运行时
}
],
"routes": [
{
"src": "/(.*)", // 所有请求
"dest": "src/app.js" // 转发到入口
}
]
}
(2)src/config/database.js(Sequelize连接Neon)
const { Sequelize } = require('sequelize');
require('dotenv').config();
// 用Vercel注入的DATABASE_URL(本地用.env)
const sequelize=new Sequelize(process.env.DATABASE_URL, {
dialect: 'postgres',
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false // Neon自签名证书,必须关
}
},
logging: false // 关闭日志,避免Vercel日志刷屏
});
module.exports=sequelize;
(3)package.json(依赖+脚本)
{
"name": "vercel-neon-backend",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2",
"sequelize": "^6.37.8",
"pg": "^8.21.0", // Postgres驱动(必须装)
"dotenv": "^16.4.5",
"cors": "^2.8.5"
},
"scripts": {
"start": "node src/app.js",
"build": "" // Vercel无需build,留空
}
}
3. 本地测试(确保连接正常)
- 项目根目录创建
.env,填入Neon连接串:
DATABASE_URL=postgresql://user:password@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require
- 安装依赖:
npm install; - 启动本地服务:
npm start; - 访问
http://localhost:3000/api/test,返回成功即连接正常。
4. 部署到Vercel(2种方式)
方式A:Git自动部署(推荐)
- 代码推送到GitHub仓库(如
yourname/vercel-neon-backend); - Vercel控制台 → 「Add New Project」→ 导入GitHub仓库;
- 配置:
-
- Framework Preset:选「Other」(Express无专属预设);
- Root Directory:
./backend(如果后端在子目录); - Environment Variables:添加
DATABASE_URL,值为Neon连接串;
- 点击「Deploy」,Vercel自动拉取代码、安装依赖、部署;
- 部署完成后,获取Vercel域名(如
vercel-neon-backend.vercel.app)。
方式B:Vercel CLI 本地部署(快速测试)
- 安装CLI:
npm i -g vercel; - 登录:
vercel login(绑定Vercel账号); - 项目目录执行:
vercel --prod; - 按提示配置项目,自动部署并生成域名。
五、第三步:验证Vercel+Neon连通性
- 访问Vercel域名+测试接口:
https://vercel-neon-backend.vercel.app/api/test; - 成功返回数据 → 后端部署+数据库连接正常;
- 失败:查看Vercel日志(「Deployments」→ 「Logs」),排查环境变量/连接串问题。
六、高频踩坑记录(避坑核心!)
🔴 坑1:Vercel只读文件系统,mkdir报错
- 错误:
ENOENT: no such file or directory, mkdir '/var/task/exports'; - 原因:Vercel函数运行目录
/var/task只读,无法创建本地文件夹; - 解决:
-
- 临时文件用系统临时目录:
const os=require('os'); const tmpDir=os.tmpdir();; - 生成文件直接流式返回前端(不存盘);
- 持久化文件用Vercel Blob/Cloudflare R2对象存储。
- 临时文件用系统临时目录:
🔴 坑2:Error: Please install pg package manually
- 错误:Sequelize提示手动安装
pg; - 原因:Vercel部署时未安装
pg依赖,或版本不兼容; - 解决:
-
package.json显式添加"pg": "^8.21.0";- 本地
npm install确认依赖正常,再推送到GitHub; - 清除Vercel缓存:「Settings」→ 「Git」→ 「Clear Cache」→ 重新部署。
🔴 坑3:Neon连接失败,sslmode=require报错
- 错误:
invalid sslmode value或self signed certificate; - 原因:Sequelize未配置SSL,或Neon连接串无
sslmode=require; - 解决:
-
- 连接串必须加
?sslmode=require; - Sequelize配置中关闭证书校验:
- 连接串必须加
dialectOptions: { ssl: { require: true, rejectUnauthorized: false } }
🔴 坑4:Vercel环境变量不生效,DATABASE_URL undefined
- 错误:
Connection string is undefined; - 原因:环境变量未配置到生产环境,或名称写错;
- 解决:
-
- Vercel「Environment Variables」→ 确认
DATABASE_URL绑定Production环境; - 本地用
vercel env pull .env拉取Vercel环境变量,避免本地/线上不一致; - 不要用
POSTGRES_URL(Vercel Postgres专属),Neon统一用DATABASE_URL。
- Vercel「Environment Variables」→ 确认
🔴 坑5:连接风暴(Too many connections)
- 错误:Neon提示
too many connections,随机500报错; - 原因:Vercel Serverless函数每次请求新建连接,流量高时打爆连接数;
- 解决:
-
- 必须用NeonPooled连接串(带
-pooler),内置连接池; - 代码中复用Sequelize实例(不要每次请求新建);
- 长事务拆分(Edge函数超时30s,事务控制在5s内)。
- 必须用NeonPooled连接串(带
🔴 坑6:Vercel部署后接口404
- 错误:访问接口返回
404 Not Found; - 原因:
vercel.json路由配置错误,或入口文件路径不对; - 解决:
-
- 确认
vercel.json中src和dest路径完全匹配; - 入口文件
app.js必须导出Express实例:module.exports=app;; - 重启部署:取消「Use existing build cache」→ 重新Deploy。
- 确认
七、优化建议(生产环境必备)
- 用Neon分支做预览环境:Vercel PR自动创建Neon分支,测试数据隔离;
- 开启Vercel「Fluid Compute」:提升Node.js函数性能(支持长连接);
- 数据库迁移用Neon「Direct连接串」:避免连接池干扰,迁移更快;
- 监控:Vercel开启日志告警,Neon监控连接数/CPU,及时发现异常。
要不要我把以上流程整理成一份可直接复制的配置文件模板包(含vercel.json、数据库配置、package.json),你直接替换信息就能用?