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

Express.js应用Vercel部署后路由正常仍返回404错误求助

const app = express();
routers.forEach(router => {
app.use('/api/v1', router);
});
module.exports = app;
module.exports.handler = serverless;

#### homeRoutes.js
```javascript
const express = require('express');
const router = express.Router();
router.get('/home', (req, res) => {
  res.send('Hello from home!');
});
module.exports = router;

server.js

// eslint-disable-next-line no-unused-vars
const dotenv = require('dotenv').config({ path: 'config.env' });
const http = require('http');
const mongoose = require('mongoose');
const app = require('./app');
// conne
const DB = process.env.DATABASE.replace(
  '<password>',
  process.env.DATABASE_PASSWORD
);
mongoose
  .connect(DB, {
    dbName: 'JSQuiz',
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true
  })
  .then(() => console.log('DB connection successful!'));
const port = process.env.PORT;
// eslint-disable-next-line no-unused-vars
const server = http.createServer(app);
server.listen(port, () => {
  console.log(`App running on port ${port}...`);
});

package.json(相关配置)

"name": "server",
"version": "1.0.0",
"engines": {
  "node": ">=8.0.0"
},

尝试过的无效vercel.json配置

{
  "routes": [
    {
      "src": "/",
      "dest": "/"
    },
    { "src": "/home", "dest": "/" }
  ]
}
{
  "routes": [{ "src": "/api/v1/home", "dest": "api/home.js" }]
}
{
  "rewrites": [{ "source": "/api/(.*)", "destination": "/api" }]
}

原因分析

Vercel部署Node.js应用时,默认会识别api目录下的独立函数作为服务端点,但你的Express应用是单入口的整体服务,之前的vercel.json配置未正确将所有API请求转发到Express入口;同时代码中虽导出了handler,但缺少serverless-http依赖,无法将Express应用转换为Vercel兼容的无服务器函数格式。

解决步骤

1. 安装依赖

执行命令安装serverless-http,用于将Express应用适配为Vercel可识别的无服务器函数:

npm install serverless-http

2. 修正app.js配置

在app.js顶部引入serverless-http,并确保正确传入Express实例导出handler:

const express = require('express');
const serverless = require('serverless-http'); // 新增引入
// Routes
const homeRouter = require('./routes/homeRoutes');
...
const app = express();
routers.forEach(router => {
  app.use('/api/v1', router);
});
module.exports = app;
module.exports.handler = serverless(app); // 传入app实例

3. 配置正确的vercel.json

在项目根目录创建或修改vercel.json,将所有API路径的请求转发到Express入口文件:

{
  "rewrites": [
    {
      "source": "/api/(.*)",
      "destination": "/app.js"
    }
  ]
}

4. 部署配置检查

  • 确保Vercel控制台的项目Environment Variables中已正确配置DATABASE、DATABASE_PASSWORD等环境变量;
  • 在Vercel的Build & Development Settings中,将Output Directory留空,避免覆盖默认的服务识别逻辑。

内容的提问来源于stack exchange,提问作者suer231232131133

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:00:14