Express.js + MongoDB + Mongoose后端部署Vercel后全路由返回404 NOT_FOUND的问题求助
兄弟,我刚仔仔细细看完你的问题,这情况我之前部署Vercel Serverless Express的时候也踩过坑,大概率是这几个核心点没适配对,给你挨个排查:
1. 最致命的问题:你的index.js没适配Vercel的Serverless函数格式
Vercel上跑Node.js后端和本地完全不是一回事——本地是靠app.listen()启动HTTP服务器,但Vercel是Serverless环境,它不需要你启动服务器,而是需要你导出一个能直接处理请求的handler/应用实例。
你没贴index.js的代码,但我猜你的index.js大概是本地启动的写法,比如:
import app from './app.js'; const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
这种代码在Vercel上完全不会生效,因为Vercel不知道怎么把请求转发给你的Express应用。你得改成适配Vercel的写法:
import app from './app.js'; // 直接导出Express应用实例,Vercel会自动把它转换成Serverless Handler export default app; // 仅本地开发时启动HTTP服务器,线上Vercel会忽略这段 if (process.env.NODE_ENV !== 'production') { const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); }
或者如果你想更严谨,也可以用http模块包装后导出:
import app from './app.js'; import { createServer } from 'http'; const server = createServer(app); export default server;
2. 必须检查:你的package.json有没有开启ES模块支持
你代码里全用的是import/export的ES模块语法,但如果你的package.json里没有加"type": "module",Node.js会默认把文件当作CommonJS模块处理,这时候会直接报错(但Vercel的函数日志可能不会直接显示,导致看起来像是404)。
赶紧在package.json里加上这个配置:
{ "type": "module", // 其他原有配置(scripts、dependencies这些) "scripts": { "dev": "node src/index.js", // ...其他脚本 } }
3. vercel.json的细节确认
你的vercel.json配置看起来没问题,但再核对两个点:
- 确保
vercel.json是放在项目根目录(和src、package.json同级),路径没搞错 - 可以把
@vercel/node加到你的依赖里,指定最新版本(比如^3.0.0),避免兼容性问题:npm install @vercel/node --save
4. 本地模拟Vercel环境测试
别再用npm run dev本地测了,用Vercel CLI的vercel dev命令启动,这个命令会完全模拟Vercel的线上Serverless环境,能提前发现代码适配问题。如果vercel dev的时候也返回404,那就是代码的问题,和Vercel部署无关,直接改代码就行。
5. 一定要看Vercel的部署日志
去Vercel控制台找到你的项目,进入对应的Deployment,仔细看Build Log和Function Logs——哪怕你说“日志没输出”,也大概率有隐藏的错误(比如模块找不到、环境变量没加载、ES语法错误),这些错误会导致你的Serverless函数启动失败,直接返回404。
等你解决404之后,记得把CORS配置的origin改成你的线上前端域名(比如你Vercel部署的前端地址),不然线上会跨域,但先把404的核心问题解决再说。
内容来源于stack exchange

