如何在Nuxt3中设置接口代理

背景

可能很多人会疑惑,为啥我们都用了服务端渲染框架,还需要用接口代理呢?其实大多数团队,都是前后端分离的架构,已经用 Java 或者其他后端语言开发并部署好了接口服务。这种情况下,我们自然只需要将前端的请求通过代理转发给服务端的server就好了。Nuxt3 中提供的 useFetch 方法封装了很多网络请求的细节,不过该方法会因为渲染模式的不同在使用上也存在着一些差异。下面笔者就将会讲述如何在各种情况下为 useFetch 方法配置请求的代理。

如何配置?

1.渲染模式为客户端渲染时

Nuxt3 最新的正式版使用了nitro做为 dev server, 在其官方文档中,有说明如何配置代理:

{
  devProxy: {
    '/proxy/test': 'http://localhost:3001',
    '/proxy/example': { target: 'https://example.com', changeOrigin: true }
  }
}

我们需要将该配置代理的选项放置到 nuxt.config.ts 文件的 nitro 选项中,如下:

export default defineNuxtConfig({
  // ...other setting
  server: false, // 不开启服务端渲染
  nitro: {
    devProxy: {
      "/api": {
        target: "http://localhost:3001", // 这里是接口地址
        changeOrigin: true,
        prependPath: true,
      },
    },
  },
});

该方式针对服务端渲染的场景也能生效,但是仅会针对发生在客户端测的请求进行代理。比如设置了server: false或者因为一些交互行为而触发的网络请求。

const { data: userinfo } = await useFetch("/api/userinfo", {
  server: false,
});

2.渲染模式为服务端渲染或者预渲染时

当我们必须得在服务端进行渲染且也需要对服务端的请求进行代理转发的话,上述方法配置是不可行的。笔者寻遍全网,发现很多解决方案是安装一些Nodejs的第三方库去实现接口代理的。其实没有必要,笔者在nitro的官方文档中找到了方案,即配置routeRules参数。

export default defineNuxtConfig({
  // ...other setting
  server: true //开启服务端渲染或者预渲染
  
  nitro: {
    devProxy: {
      "/api": {
        target: "http://localhost:3001", // 这里是接口地址
        changeOrigin: true,
        prependPath: true,
      },
    },
    // 该配置用于服务端请求转发
    routeRules: {
      '/api/**': {
        proxy: 'http://localhost:3001/**'
      }
    }
  },
})

踩坑记录

1. 配置 vite 的代理不生效

从 RC12 开始,vite 的代理配置就不再被支持了。下述配置方法将不再可用。

  vite: {
    server: {
      proxy: {
        '/api': {
          target: 'http://localhost:8080',
        },
      },
    },
  },

2. 服务端请求代理配置不生效

routeRules中支持配置 proxy 必须要在 Nuxt3.2 版本才能生效, 笔者升级后版本如下:
image.png

结语

博客原创地址:Nuxt3实战系列之接口的请求代理配置

欢迎读者朋友们批评指正。

联系作者:imwty2023(微信),iwhitney@163.com(邮箱)


开发小记
记录一次次入坑和翻坑的经历

Enjoy creating rather than coding!

1.1k 声望
93 粉丝
0 条评论
推荐阅读
Nuxt3中如何引入Vant UI+移动端适配处理
之前笔者分享了如何在Nuxt3中使用Element Plus UI,但那是PC端的UI组件库,不适用于做移动端页面。做移动端比较主流的UI库就是Vant UI了。接下来我们讲讲如何在Nuxt3中使用VantUI。

imwty阅读 507

「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs39阅读 4.7k评论 5

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.8k评论 9

用了那么久的 SVG,你还没有入门吗?
其实在大部分的项目中都有 直接 或 间接 使用到 SVG 和 Canvas,但是在大多数时候我们只是选择 简单了解 或 直接跳过,这有问题吗?没有问题,毕竟砖还是要搬的!

熊的猫16阅读 1.5k评论 2

封面图
嘿,vue中keep-alive有个「大坑」你可能还不知道
背景是这样的,我们使用vue2开发一个在线客服使用的IM应用,基本布局是左边是访客列表,右边是访客对话,为了让对话加载更友好,我们将对话的路由使用<keep-alive>缓存起来。但是如果将所有对话都缓存,未...

wuwhs12阅读 2.5k

封面图
什么?后端要一次性返回我10万条数据!且看我这8种方案机智应对!
问题描述面试官:后端一次性返回10万条数据给你,你如何处理?我:歪嘴一笑,what the f**k!问题考察点看似无厘头的问题,实际上考查候选人知识的广度和深度,虽然在工作中这种情况很少遇到...考察前端如何处理大...

水冗水孚15阅读 3.6k评论 1

Enjoy creating rather than coding!

1.1k 声望
93 粉丝
宣传栏