在Vercel部署Express.js失败:Edge Function'middleware'引用不支持模块
解决Express.js部署Vercel时Edge Function "middleware"模块不支持的错误
问题原因
Vercel会自动检测项目中的middleware.js/middleware.ts文件并将其作为Edge Function运行,但Edge Runtime不支持Node.js专属模块(如express、fs等)。如果你的项目中存在这类middleware文件,且它引用了不兼容的模块,就会触发该错误。另外,若vercel.json配置未明确指定middleware的运行时,也会导致冲突。
解决方案
1. 检查并处理middleware文件
- 查看项目根目录或
api目录下是否存在middleware.js/middleware.ts文件:- 如果不需要该middleware,直接删除即可。
- 如果需要保留,要么修改文件内容适配Edge Runtime(替换所有Node.js专属模块为Edge支持的API,比如用
fetch替代axios);要么配置Vercel用Node.js Runtime运行它(见步骤2)。
2. 修改vercel.json明确指定运行时
如果要保留middleware并使用Node.js Runtime,在builds数组中添加对应配置:
{ "version": 2, "builds": [ { "src": "./api/index.js", "use": "@vercel/node" }, { "src": "./middleware.js", // 替换为你的middleware实际路径 "use": "@vercel/node" } ], "routes": [ { "src": "/(.*)", "dest": "/api" } ] }
3. 确保Express入口文件符合Vercel Node规范
你的api/index.js需要用serverless-http包装Express应用,否则Vercel无法正确处理请求:
const express = require('express'); const serverless = require('serverless-http'); const app = express(); // 示例路由逻辑 app.get('/', (req, res) => { res.send('Express running on Vercel'); }); // 导出serverless兼容的handler module.exports.handler = serverless(app);
执行npm install serverless-http安装依赖包。
4. 清理缓存重新部署
- 删除本地项目的
.vercel目录,重新推送代码到Vercel。 - 在Vercel控制台部署时,勾选"Skip Build Cache"选项,避免缓存导致的配置冲突。
内容的提问来源于stack exchange,提问作者Henok
相关产品推荐
相关产品推荐

