question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

The fetch() hook is no longer called on the client-side in production/universal mode

See original GitHub issue

Hey!

First of all thanks for the nice work 😃

I encountered something really strange and I’m not too sure about it but it looks like that the new fetch() hook of nuxt is not called on the client-side when in production mode:

Version

@nuxt/content: ^1.6.0 nuxt: 2.14.0

Steps to reproduce

Create a dynamic page component with a fetch() hook (example: pages/projects/_slug.vue).

export default {
  fetch() {
    console.log('fetch');
  }
}

What is Expected?

Fetch to be called when navigation occurs and a project is shown on the client side.

What is actually happening?

Fetch is only called on the client side when in development mode. In production mode, it is never called (only on the server).

Issue Analytics

  • State:open
  • Created 3 years ago
  • Reactions:4
  • Comments:16 (5 by maintainers)

github_iconTop GitHub Comments

8reactions
gsjencommented, Feb 23, 2021

After stepping through production code, I found the issue (for me at least) is not that fetch isn’t called. It’s that the component’s fetchKey is misaligned with the cached fetch data ($nuxt._pagePayload.fetch). After setting a custom fetchKey (thanks to #8466), the issue went away.

If this is indeed the correct solution, the documentation should give some guidance on when to use the new fetchKey option when using Nuxt Content.

2reactions
katerlouiscommented, Feb 18, 2021

In full static mode, fetch is mocked by the generated data, why do you need it to be called?

If the content would show up on client-side navigation, I would agree with you. Since it doesn’t we have to call $fetch() by hand again.

We use a component in pages/index.vue that fetches stories written in *.md-files with Nuxt-content (<slug>-<locale>.md). Each md-file has yaml vars up top for title, description etc. and locale.

  • $ npm run generate and $ npm run start shows the stories on initial load, which makes sense, because the stories are hardcoded into dist/index.html.
  • When you now navigate to another site, then back without refreshing, the stories are still there.
  • When you now navigate to another site, then refresh, then click on the logo to go to / again, the stories are not there.

That must mean fetch()-hook is not called or the “caching” that Nuxt uses under the hood doesn’t really work with Nuxt-Content.

Here is our component:

export default {
  name: 'StoriesAboutTonaly',

  data() {
    return {
      stories: null,
      maxStories: 10,
    };
  },

  async fetch() {
    const locale = this.$i18n.locale;
    const limit = this.maxStories;
    this.stories = await this.$content('stories')
      .limit(limit)
      .only([
        'slug',
        'path',
        'mainHeadline',
        'subHeadline',
      ])
      .where({
        locale, // object-shorthand syntax
      })
      .sortBy('priority', 'desc')
      .fetch()
      .then((res) => {
        return res;
      });
  },
  mounted() {
    // need to fetch stories again on client side
    // this.fetchStories(); // disabled to showcase the issue
  },
  methods: {
    fetchStories() {
      this.$fetch();
    },
  },

Maybe I’ll find time to recreate the issue in a sandbox, but for now I hope this information helps getting to the bottom of this.

Read more comments on GitHub >

github_iconTop Results From Across the Web

The Fetch Hook - Nuxt
The fetch hook is for fetching data asynchronously. It is called on server-side when rendering the route, and on client-side when navigating.
Read more >
Difference between Asyncdata vs Fetch - vue.js - Stack Overflow
The fetch method is used to fill the store before rendering the page, it's like the asyncData method except it doesn't set the...
Read more >
NextJS / React SSR: 21 Universal Data Fetching Patterns ...
What's special about this hook? You're free to put React Component anywhere in your application. By default, it will server-render the first ...
Read more >
Firebase JavaScript SDK Release Notes - Google
Introduce client-side indexing with beta API setIndexConfiguration() . ... When issued for queries that are being listened to, get() calls no longer send ......
Read more >
Creating Server-side Rendered Vue.js Apps Using Nuxt.js
This is a big indication that something is wrong with the application logic. Thankfully, an error will be generated in your browser's console...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found