Nuxt serverMiddleware部署到Vercel无服务器函数时找不到Axios
解决Vercel部署Nuxt ServerMiddleware时找不到Axios模块的问题
问题核心:本地运行正常,但部署到Vercel后,serverless函数报错找不到axios.cjs模块,尽管Axios已声明在dependencies中。
问题根源
你的vercel.json同时配置了两种API处理方式:
- 用
@vercel/node单独构建api/index.js - 用
@nuxtjs/vercel-builder的serverFiles包含api/**
这会导致两个独立的构建流程,@vercel/node构建时可能未正确处理Axios的模块依赖,或者和Nuxt的依赖打包逻辑冲突。
解决方案
1. 简化vercel.json配置
移除单独的@vercel/node构建块,完全交给@nuxtjs/vercel-builder处理ServerMiddleware,它会自动将你的ServerMiddleware转换为Vercel Serverless Functions:
{ "version": 2, "builds": [ { "src": "nuxt.config.js", "use": "@nuxtjs/vercel-builder", "config": { "serverFiles": ["api/**"] } } ] }
2. 修正nuxt.config.js的ServerMiddleware配置
生产环境也需要启用ServerMiddleware(@nuxtjs/vercel-builder会自动适配Vercel环境),同时建议配置路径前缀避免路由冲突:
// nuxt.config.js export default { // ...其他配置 serverMiddleware: [ { path: '/api', handler: '~/api/index.js' } ] }
3. 调整API文件的路由路径
因为ServerMiddleware已经挂载到/api前缀,所以需要修改api/index.js中的路由,去掉重复的/api前缀:
// ~/api/index.js import express from 'express' import bodyParser from 'body-parser' import axios from 'axios' const app = express() app.use(bodyParser.json()) // 路由改为/product,对应访问路径/api/product app.get('/product', async function (_, res) { const url = 'https://connect.squareup.com/v2/catalog/list?types=ITEM' const headers = { Authorization: `Bearer abc` } const result = await axios.get(url, { headers }) res.status(200).send(result.data) }) export default app
4. (可选)解决Axios版本冲突
你同时安装了@nuxtjs/axios(依赖Axios 0.x)和axios@1.2.1,可能存在版本兼容问题。建议降级Axios到0.27.x:
npm uninstall axios npm install axios@0.27.2
5. 清理缓存重新部署
在Vercel控制台的部署页面,点击"Redeploy"并勾选"Clear build cache",确保依赖被重新安装打包。
验证
部署完成后,访问https://your-vercel-domain/api/product,应该能正常返回数据,函数日志不再出现模块缺失错误。
内容的提问来源于stack exchange,提问作者DJDMorrison
相关产品推荐
相关产品推荐

