In Next.js, you can create a custom hook to handle API errors by using the useEffect
hook to make API requests and then handle any errors that may occur. Here's a basic example of how you can implement a custom hook for handling API errors in Next.js:
jsx// api.js
import axios from 'axios';
export const fetchData = async () => {
try {
const response = await axios.get('/api/data');
return response.data;
} catch (error) {
throw error.response.data;
}
};
// useApi.js
import { useEffect, useState } from 'react';
import { fetchData } from './api';
const useApi = () => {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchDataFromApi = async () => {
try {
const result = await fetchData();
setData(result);
} catch (error) {
setError(error);
} finally {
setLoading(false);
}
};
fetchDataFromApi();
}, []);
return { data, error, loading };
};
export default useApi;
In this example:
The fetchData
function in api.js
makes an API request using the Axios library. If there is an error, it throws the error response data.
The useApi
custom hook in useApi.js
uses the useEffect
hook to fetch data when the component mounts.
Inside the fetchDataFromApi
function, we call the fetchData
function and handle both successful responses and errors. If the request is successful, we set the data using setData
; if there is an error, we set the error using setError
. Finally, we set the loading state to false
to indicate that the request has been completed.
You can use this useApi
hook in your Next.js components to handle API errors. For example:
jsx// MyComponent.js
import useApi from './useApi';
const MyComponent = () => {
const { data, error, loading } = useApi();
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error.message}</div>;
}
return (
<div>
{/* Render your component using the fetched data */}
{data && <div>{data.someProperty}</div>}
</div>
);
};
export default MyComponent;
This is a basic example, and you can customize it based on your specific needs, such as handling different types of errors or providing more information in the error messages.