You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express.js + MongoDB + Mongoose后端部署Vercel后全路由返回404 NOT_FOUND的问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:02:58