Express.js项目部署至Vercel遇404错误,求解决方案及数据库集成方法
Express.js 部署到 Vercel 遇到404的解决方案、可行性及数据库集成指南
一、Express.js 能否部署到 Vercel?
能。Vercel 支持部署 Node.js 后端项目,包括 Express.js,但需要遵循 Vercel 的 Serverless Functions(或 Edge Functions)规范——因为 Vercel 默认针对前端静态资源或无服务器函数优化,直接部署传统 Express 服务器会存在适配问题。
二、解决部署后404的问题
本地运行正常但 Vercel 显示404,通常是项目结构或配置不符合 Vercel 要求,以下是核心修复步骤:
1. 适配 Vercel Serverless Functions 规范
Vercel 默认要求后端代码放在 api 目录下,每个文件对应一个接口路由。如果你的 Express 是单文件服务器,需调整结构:
- 新建
api文件夹,在其中创建index.js,将 Express 逻辑适配为无服务器函数格式:
const express = require('express'); const app = express(); const router = express.Router(); // 原有路由逻辑示例 router.get('/', (req, res) => { res.send('Hello from Express on Vercel!'); }); router.get('/api/data', (req, res) => { res.json({ message: 'Sample data' }); }); app.use('/', router); // 导出 Vercel 所需的处理函数 module.exports = app;
- 若使用 ES 模块,需在
package.json中添加"type": "module",并改用export default app;导出。
2. 自定义路由规则(可选)
若不想使用默认的 api 目录,可在项目根目录创建 vercel.json 配置转发规则,避免路由不匹配:
{ "rewrites": [ { "source": "/(.*)", "destination": "/api/index.js" } ] }
该配置会将所有请求转发到 api/index.js 中的 Express 应用处理。
3. 检查依赖与脚本配置
- 确保
package.json中包含 Express 依赖,无缺失项:
{ "dependencies": { "express": "^4.18.2" } }
- 确保
node_modules在.gitignore中,Vercel 部署时会自动安装依赖,无需手动上传。
4. 移除硬编码端口
本地常用固定端口(如3000),但 Vercel 会自动分配端口,需改用环境变量适配:
const port = process.env.PORT || 3000; // 仅本地运行时监听端口,Vercel 部署时无需此逻辑 if (process.env.NODE_ENV !== 'production') { app.listen(port, () => { console.log(`Server running on port ${port}`); }); }
三、Express.js 集成数据库到 Vercel
Vercel 支持多种数据库方案,以下是常见实现方式:
1. 无服务器数据库(推荐)
- PlanetScale(MySQL 兼容):在 Vercel 控制台关联 PlanetScale 数据库,获取连接字符串后,用
mysql2或sequelize连接:
const mysql = require('mysql2/promise'); async function getConnection() { return mysql.createConnection(process.env.DATABASE_URL); } router.get('/api/users', async (req, res) => { const conn = await getConnection(); const [rows] = await conn.query('SELECT * FROM users'); res.json(rows); await conn.end(); });
- MongoDB Atlas:获取 Atlas 连接字符串,存入 Vercel 环境变量(项目设置→Environment Variables),用
mongoose连接:
const mongoose = require('mongoose'); mongoose.connect(process.env.MONGODB_URI) .then(() => console.log('Connected to MongoDB')) .catch(err => console.error(err));
2. Vercel KV(键值数据库)
针对简单键值存储需求,可直接使用 Vercel 官方 KV 服务,启用后通过 SDK 操作:
import { kv } from '@vercel/kv'; router.get('/api/set-key', async (req, res) => { await kv.set('test-key', 'hello-vercel'); res.send('Key set'); }); router.get('/api/get-key', async (req, res) => { const value = await kv.get('test-key'); res.json({ value }); });
3. 核心注意事项
- 所有数据库连接字符串、密钥必须存入 Vercel 环境变量,禁止硬编码到代码中。
- 无服务器函数每次调用可能重建连接,建议使用连接池或按需创建连接,避免长时间持有连接。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

