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
相关产品推荐
相关产品推荐

