Logo Dark
Get in Touch

Deep Dive Into Nuxt 3 Server Side Data Fetching

Written by Jay Bharadia
Published31 August 2023
Frontend
Dev
Nuxt.js has long been a popular framework for creating server-side rendered (SSR) Vue.js applications. With the release of Nuxt 3, developers gained access to exciting new features and improvements. However, while working with Nuxt 3 and utilizing the useAsyncData composable, I encountered a perplexing error that took some time to understand and resolve. In this article, I will share my experience with the useAsyncData composable, outline the error I faced, and discuss the solution I found.

The Error

A composable that requires access to the Nuxt instance was called outside of a plugin, Nuxt hook, Nuxt middleware, or Vue setup function

  • During my exploration of Nuxt 3's data fetching capabilities, I discovered the useAsyncData composable, which is designed to simplify fetching data asynchronously on the server-side.
    • However, when I attempted to use multiple composables within the asyncData hook, I encountered the following error: "A composable that requires access to the Nuxt instance was called outside of a plugin, Nuxt hook, Nuxt middleware, or Vue setup function."
    // composables/useArticle.js 

return new Promise(async (resolve) => {
// useArticleById and useFeaturedArticleId both needs useDirectusItems() composable methods. 
// Error occurs 
    const featureArticleId = await useFeaturedArticleId(); // first composable 

    const featuredArticle = await useArticleById( // second composable. Nuxt instance is lost here 
        featureArticleId,
        getItemById
    );

    resolve(featuredArticle);
});

export const useArticleById = (id, getItemById) => {
// In this method, Nuxt instance is lost and causes Error. 
// Cannot call composable anymore. 
    const { getItemById } = useDirectusItems();

    return getItemById({
        collection: "xyz_articles",
        id,
        params: {
            fields,
        },
    });
};

export const useFeaturedArticleId = () => {
    return useArticleSettings().then((settings) => {
        return settings.featured_article;
    });
};
  

Understanding the Error

  • It's important to grasp the context in which Nuxt 3 data fetching functions operate.
  • Nuxt.js utilizes server middleware and plugins to set up the application's environment before rendering the components.
  • The useAsyncData composable, along with other composables, relies on this setup to function properly.
  • Consequently, when attempting to call multiple composables directly within the useAsyncData hook, the error arises because the necessary Nuxt instance context is missing.

The Solution

  • I devised a solution that involved rearranging the way I called the composables within the useAsyncData hook.
  • By calling the neccessary composables at start of method and passing it in respective composables, I was able to ensure that the required composables had access to the Nuxt instance.
  • Here's an example of how I implemented the solution
    // composables/useArticle.js 

return new Promise(async (resolve) => {
    const { getItemById } = useDirectusItems(); // Using the neccessary composable at start

    const featureArticleId = await useFeaturedArticleId(); // first composable 

    const featuredArticle = await useArticleById( // second composable. Nuxt instance is lost here 
        featureArticleId,
        getItemById
    );

    resolve(featuredArticle);
}); 

// ...other composables same except remove the getItemById since it is available at start of composable
  

Important Information

  • ❌ Don't use asyncData hook. As mentioned in documentation, Recommended method is 

Conclusion

  • Working with Nuxt 3 and the useAsyncData composable can provide significant advantages for server-side data fetching.
  • However, it's important to be aware of the error that can occur when calling multiple composables directly within the asyncData hook.
  • By understanding the underlying cause of the error and implementing a solution developers can avoid this issue and leverage the power of Nuxt 3's data fetching capabilities.
  • By sharing my experience and providing a solution to the error I encountered, I hope to assist fellow developers in navigating similar challenges and enable them to fully leverage the capabilities of Nuxt 3.

Helpful Links

More

An interesting read? Here is more related to it.

Most Popular Directus Extensions
07 March 2024
/
Jay Bharadia
Frontend
Plugins
What are Design Patterns and why you should know them?
01 September 2023
/
Cavin Macwan
Software Architecture
Dev

We Make pixel perfect things

We Make pixel perfect things

We Make pixel perfect things

We Make pixel perfect things

We Make pixel perfect things

We Make pixel perfect things

India (HQ)

201, iSquare Corporate Park, Science City Road, Ahmedabad-380060, Gujarat, India

Canada

24 Merlot Court, Timberlea, NS B3T 0C2, Canada

For Sales

[email protected]

Looking For Jobs

Apply Now

LinkedIn
Instagram
X
Facebook
Youtube
Discord
Dribbble
Behance
Github