You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3中useLazyAsyncData因数据结构报错,求简化结构实现骨架屏

解决Nuxt3 + Contentful中useLazyAsyncData的TypeError及数据结构优化

问题根源

  1. 你用Promise.all包裹单个请求,导致返回结果被包装成数组,这是第一个[0]层级的来源
  2. Contentful的getEntries返回结构自带items数组,这是第二个[0]层级的来源
  3. useLazyAsyncData处于pending状态时entry.value为null,直接访问entry.value[0]会触发TypeError

修正后的代码

const {
  data: entry,
  pending,
  error,
} = await useLazyAsyncData('entry', async () => {
  try {
    // 移除多余的Promise.all,直接发起单个请求
    const response = await $contentful.getEntries({
      content_type: 'blog',
      limit: 1,
      'fields.slug': slug,
    });
    // 提取目标数据,直接返回fields对象,消除[0]层级
    return response.items?.[0]?.fields || null;
  } catch (err) {
    console.error(err);
    return null;
  }
});

// 现在可直接通过entry.value.title访问标题
const blogs = toRaw(entry.value);
console.log(blogs);

关键优化点

  • 移除Promise.all:单个请求无需用Promise.all包裹,避免结果被包装成数组
  • 直接提取目标字段:用可选链?.避免空值报错,直接返回fields对象,后续可直接通过entry.value.title访问内容
  • 完善错误处理:通过try/catch捕获请求异常,返回null避免未捕获Promise错误
  • 保留pending状态:useLazyAsyncData的pending状态可正常用于骨架屏加载逻辑

多请求场景兼容(如果需要)

如果后续要处理多个Contentful请求,可在Promise.all后拆解数组再提取目标数据:

const { data: entry } = await useLazyAsyncData('entry', async () => {
  try {
    const [blogRes, otherRes] = await Promise.all([
      $contentful.getEntries({ content_type: 'blog', limit: 1, 'fields.slug': slug }),
      // 其他Contentful请求
    ]);
    return blogRes.items?.[0]?.fields || null;
  } catch (err) {
    console.error(err);
    return null;
  }
});

内容的提问来源于stack exchange,提问作者K Jesus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:52:09