nuxt3接口封装

本文介绍了如何在Nuxt3项目中进行接口封装,包括创建api目录、模块划分、接口文件命名规范,并展示了如何在composables中使用useApi。作者还分享了学习过程中的注意事项和期待社区反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、新建项目

npx nuxi@latest init my-app

二、完善项目目录

根据 Nuxt 官方文档,并结合项目实际情况完善项目相关目录

因为该项目仅用于演示在 Nuxt3 中接口的封装,所以在此只添加了与接口封装相关的 2 个文件目录

image.png

三、接口封装

  1. 在 api 目录下新建 modulesapi.tsindex.ts

    image.png

    // modules
    
    * 该目录中存放项目所有接口文件
    * 该目录中的文件层级不限,可按照任意模式划分目录结构,但接口文件名称需统一设为 `*.ts`,且接口文件名称不可重复
    
    例:可按接口类型划分目录结构
      modules
      ├─ get
      │   ├─ a.ts
      │   ├─ b.ts
      ├─ post
      │   ├─ c.ts
      ├─ put
      │   ├─ d.ts
      ├─ delete
      │   ├─ e.ts
    
    例:可按项目模块划分目录结构
      modules
      ├─ access
      │   ├─ login.ts
      │   ├─ logout.ts
      ├─ list.ts
    
    
    // modules/list.ts
    
    import $api from "@/api/api";
    
    export default {
      listGet: (id: number) => {return $api(`/list/${id}`, { method: `get` })},
      listPost: (body: any) => {return $api(`/list`, { method: `post`, body })},
      listPut: (id: number, body: any) => {return $api(`/list/${id}`, { method: `put`, body })},
      listDelete: (body: any) => {return $api(`/list`, { method: `delete`, body })},
    };
    
    // api.ts
    
    const $api = $fetch.create({
      // 请求拦截
      onRequest(req) {
        // 请求拦截相关配置
      },
    
      // 请求错误拦截
      onRequestError(reqErr) {
        // 请求错误拦截相关配置
      },
    
      // 响应拦截
      onResponse(res) {
        // 响应拦截相关配置
      },
    
      // 响应错误拦截
      onResponseError(resErr) {
        // 响应错误拦截相关配置
        console.table(resErr);
      },
    });
    
    export default $api;
    
    
    // index.ts
    // 获取 modules 目录下文件名格式为 `*.ts` 的文件并导出
    
    const modulesFiles: Record<string, any> = import.meta.glob("./modules/**/*.ts", { eager: true });
    
    let modules: Record<string, any> = {};
    
    for (const modulePath in modulesFiles) {
      const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1").split("/").pop();
      modules[moduleName || ''] = modulesFiles[modulePath].default;
    }
    
    export default modules;
    
    
  2. 在 composables 目录下新建 useApi.ts

    image.png

    // useApi.ts
    
    import api from "@/api/index";
    
    export const useApi = () => api;
    
    

至此,接口封装完成,可以在页面中使用了,使用示例如下:

// pages/index.ts

<template>
  <div>
    
  </div>
</template>

<script setup lang="ts">
const list = () => {
  const id = 1;
  useApi().list.listGet(id).then(res => {console.log(res)})
}
</script>

<style scoped>

</style>

坑是踩不完的,学如逆水行舟,不进则退。如有不完善或错误的地方请大家指正,大家共同进步!

### Nuxt3封装 HTTP 请求的实现方式 在 Nuxt3 中,官方推荐使用 `useFetch` 和 `$fetch` 来替代传统的 Axios 库进行网络请求。这些工具提供了更加简洁和高效的 API 设计模式,同时也支持自定义封装以满足项目的特定需求。 以下是基于 Nuxt3 的 HTTP 请求封装教程: #### 1. 使用 Composition API 自定义 Hook 可以通过创建一个组合函数来封装所有的网络请求逻辑。这种做法不仅提高了代码复用性,还使得全局范围内的请求操作变得更加一致。 ```javascript // utils/useRequest.js export function useRequest(url, options = {}) { const { method = &#39;GET&#39;, body = null, ...rest } = options; return useFetch(url, { method, body, ...rest, }); } ``` 上述代码片段展示了如何利用 `useFetch` 创建一个新的钩子函数 `useRequest`[^2]。此函数接受 URL 和选项参数作为输入,并返回经过封装后的响应对象。 #### 2. 配置默认基础路径与头部信息 为了减少重复工作量并增强安全性,可以预先设定一些通用属性比如 BaseURL 或者 Authorization Token 等等。 编辑 `nuxt.config.ts` 文件如下所示: ```typescript // nuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { public: { apiBase: process.env.API_BASE || &#39;/api&#39;, }, }, }); ``` 接着修改我们之前定义好的 hook 函数使其能够读取到环境变量中的 base url 值. ```javascript import { useRuntimeConfig } from &#39;#app&#39;; export function useRequest(url, options = {}) { const config = useRuntimeConfig(); const fullUrl = `${config.public.apiBase}${url}`; const headers = { ...(options.headers ?? {}), &#39;Content-Type&#39;: &#39;application/json&#39; }; return useFetch(fullUrl, { ...options, headers, }); } ``` 这里引入了 `useRuntimeConfig()` 方法获取运行时配置项,从而动态拼接完整的接口地址[^4]. #### 3. 添加错误处理机制 当遇到服务器端异常或者超时时,应该给予用户友好的提示而不是让程序崩溃掉。因此我们需要扩展我们的 request 工具加入 try-catch 结构以及相应的 fallback 行动方案。 更新后的版本可能看起来像这样: ```javascript export async function safeUseRequest(url, options = {}) { let result; try { result = await useRequest(url, options)(); } catch (error) { console.error(&#39;An error occurred during the request:&#39;, error); throw new Error(`Failed to load data from ${url}`); } return result; } ``` 以上就是关于怎样在 Nuxt3 上面构建起一套完善的 HTTP 请求解决方案的一个简单指南[^1]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值