Vercel部署后端+Neon Postgres实战记录

6 阅读5分钟

一、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存储、无限计算时间、自动备份;
    • 支持「数据库分支」,预览环境自动隔离数据。

二、实战前置准备

  1. 账号:Vercel账号(绑定GitHub)、Neon账号(可邮箱注册);
  2. 代码:Node.js后端(Express/Nest均可),示例用Express+Sequelize;
  3. 工具:Vercel CLI(可选,本地调试用)、Postman(接口测试)。

三、第一步:Neon 创建Postgres数据库(2种方式)

方式A:Neon控制台手动创建(推荐新手)

  1. 登录 console.neon.tech,点击「New Project」;
  2. 配置:
    • Project Name:自定义(如vercel-backend-db);
    • Region:选US East(N. Virginia) (离Vercel最近,延迟最低);
    • Postgres Version:16(最新稳定版);
  1. 点击「Create Project」,10秒内创建完成;
  2. 获取连接字符串(关键!):
    • 进入「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 一键集成(推荐自动化)

  1. Vercel控制台 → 进入项目 → 「Storage」→ 「Create Database」→ 选「Postgres(Neon)」;
  2. 授权Neon账号,选择「Create New Neon Account」;
  3. 配置区域/数据库名,自动创建并注入环境变量(DATABASE_URL等);
  4. 优势:无需手动复制连接串,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. 本地测试(确保连接正常)

  1. 项目根目录创建.env,填入Neon连接串:
DATABASE_URL=postgresql://user:password@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require
  1. 安装依赖:npm install
  2. 启动本地服务:npm start
  3. 访问http://localhost:3000/api/test,返回成功即连接正常。

4. 部署到Vercel(2种方式)

方式A:Git自动部署(推荐)

  1. 代码推送到GitHub仓库(如yourname/vercel-neon-backend);
  2. Vercel控制台 → 「Add New Project」→ 导入GitHub仓库;
  3. 配置:
    • Framework Preset:选「Other」(Express无专属预设);
    • Root Directory:./backend(如果后端在子目录);
    • Environment Variables:添加DATABASE_URL,值为Neon连接串;
  1. 点击「Deploy」,Vercel自动拉取代码、安装依赖、部署;
  2. 部署完成后,获取Vercel域名(如vercel-neon-backend.vercel.app)。

方式B:Vercel CLI 本地部署(快速测试)

  1. 安装CLI:npm i -g vercel
  2. 登录:vercel login(绑定Vercel账号);
  3. 项目目录执行:vercel --prod
  4. 按提示配置项目,自动部署并生成域名。

五、第三步:验证Vercel+Neon连通性

  1. 访问Vercel域名+测试接口:https://vercel-neon-backend.vercel.app/api/test
  2. 成功返回数据 → 后端部署+数据库连接正常;
  3. 失败:查看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 valueself 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

🔴 坑5:连接风暴(Too many connections)

  • 错误:Neon提示too many connections,随机500报错;
  • 原因:Vercel Serverless函数每次请求新建连接,流量高时打爆连接数;
  • 解决:
    • 必须用NeonPooled连接串(带-pooler),内置连接池;
    • 代码中复用Sequelize实例(不要每次请求新建);
    • 长事务拆分(Edge函数超时30s,事务控制在5s内)。

🔴 坑6:Vercel部署后接口404

  • 错误:访问接口返回404 Not Found
  • 原因:vercel.json路由配置错误,或入口文件路径不对;
  • 解决:
    • 确认vercel.jsonsrcdest路径完全匹配
    • 入口文件app.js必须导出Express实例module.exports=app;
    • 重启部署:取消「Use existing build cache」→ 重新Deploy。

七、优化建议(生产环境必备)

  1. 用Neon分支做预览环境:Vercel PR自动创建Neon分支,测试数据隔离;
  2. 开启Vercel「Fluid Compute」:提升Node.js函数性能(支持长连接);
  3. 数据库迁移用Neon「Direct连接串」:避免连接池干扰,迁移更快;
  4. 监控:Vercel开启日志告警,Neon监控连接数/CPU,及时发现异常。

要不要我把以上流程整理成一份可直接复制的配置文件模板包(含vercel.json、数据库配置、package.json),你直接替换信息就能用?