axios 是一个广泛使用的 javascript 库,可以更轻松地向服务器发送 http 请求。它的突出功能之一是拦截器,它允许我们的应用程序捕获请求和响应。 axios 拦截器让我们可以设置在每个请求或响应到达应用程序之前运行的函数。这对于全局添加身份验证令牌、日志记录和处理错误等任务很有帮助,使我们的代码更干净、更易于管理。
在这篇博文中,我们将学习如何在 next.js 应用程序中实现 axios 请求拦截器。我们将从设置 axios 开始,然后我们将了解如何创建和使用请求和响应拦截器。最后,您将了解如何使用拦截器来改进您的应用程序并保持代码井井有条。
在深入研究如何在 next.js 应用程序中实现 axios 请求拦截器之前,请确保您具备以下条件:
已安装 node.js 和 npm/yarn :确保您的计算机上安装了 node.js 和 npm(或yarn)。您可以从这里下载 node.js。
next.js 项目设置:您应该有一个 next.js 项目设置。如果您没有,您可以使用 create next app 创建一个新的 next.js 项目:
npx create-next-app my-axios-app cd my-axios-app npm install axios
或
yarn add axios
axios 中的请求拦截器允许您在请求到达服务器之前对其进行修改。它们对于添加身份验证令牌、设置自定义标头或记录请求非常有用。以下是如何在 next.js 应用程序中实现 axios 请求拦截器。
在 lib 文件夹(或项目中的任何首选位置)中创建一个新文件 axiosinstance.js。您可以将请求拦截器添加到之前创建的 axios 实例中。这个拦截器将在每个请求发出之前执行。
创建 axios 实例允许您设置默认配置,例如基本 url 和标头,这些配置将应用于使用该实例发出的所有请求。这有助于保持代码干燥(不要重复自己)。
在 lib 文件夹中创建一个名为 axiosinstance.js 的新文件并设置您的 axios 实例:
// lib/axiosinstance.js import axios from 'axios'; const axiosinstance = axios.create({ baseurl: 'https://dummyjson.com', // replace with your api base url timeout: 1000, headers: { 'content-type': 'application/json' } }); // add a request interceptor axiosinstance.interceptors.request.use( function (config) { // do something before the request is sent // for example, add an authentication token to the headers const token = localstorage.getitem('authtoken'); // retrieve auth token from localstorage if (token) { config.headers.authorization = `bearer ${token}`; } return config; }, function (error) { // handle the error return promise.reject(error); } ); export default axiosinstance;
这是我们所做的总结:
设置好请求拦截器后,您可以像往常一样在 next.js 页面或组件中使用 axios 实例。拦截器将在发送每个请求之前自动添加令牌(或执行任何其他配置的操作)。
// pages/index.js import react, { useeffect, usestate } from 'react'; import axiosinstance from '../lib/axiosinstance'; export default function home() { const [data, setdata] = usestate(null); useeffect(() => { axiosinstance.get('/products/1') // replace with your api endpoint .then(response => { setdata(response.data); }) .catch(error => { console.error('error fetching data:', error); }); }, []); return ( <div> <h1>data from api</h1> {data ? ( <pre class="brush:php;toolbar:false">{json.stringify(data, null, 2)}
) : ( )}