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

Nuxt3开发MicroCMS应用时遇到错误:A composable that requires access to the Nuxt instance was called outside of a plugin

Nuxt3开发MicroCMS应用时遇到错误:A composable that requires access to the Nuxt instance was called outside of a plugin

我来帮你排查这个问题!这个错误的核心原因是你在普通<script>标签的顶层直接调用了useFetch,而useFetch这类Nuxt内置的composable必须在Nuxt实例的上下文环境中才能正常工作,普通<script>的顶层代码会脱离这个上下文,所以触发了报错。

问题代码定位

看你的pages/list.vue:

<script>
const {data:reviews} = await useFetch('/api/reviewList')
</script>

这里使用的是普通<script>标签,没有用Nuxt3推荐的<script setup>,顶层await会导致useFetch无法访问到Nuxt实例的上下文信息(比如路由、环境配置等),进而抛出错误。

修复方案

把pages/list.vue的<script>改成<script setup>,它会自动帮你处理上下文环境,天然支持顶层await:

<template>
  <div class="flex flex-col">
    <div>
      <h1 class="m-3 text-4xl font-bold">当店のレビュー一覧</h1>
    </div>
    <!-- 新增可选链和默认空数组,避免数据加载前undefined报错 -->
    <ReviewList :reviews="reviews?.contents || []" />
  </div>
</template>

<script setup>
const { data: reviews } = await useFetch('/api/reviewList')
</script>

我额外给reviews?.contents加了|| []的默认值,因为useFetch是异步加载数据的,页面初始化时reviews还未拿到返回结果,直接传reviews.contents会导致undefined报错,加默认空数组能保证组件始终接收到数组类型的props,正常渲染。

补充说明

Nuxt的所有内置composables(比如useFetch、useRuntimeConfig、useRoute等)都必须在以下场景中调用:

  • 页面/组件的<script setup>标签内
  • 组件的setup()函数内
  • Nuxt插件文件中

普通<script>标签的顶层代码会在Nuxt实例初始化前执行,完全脱离上下文,所以绝对不能在这里调用这类composables。

你的其他代码(组件、类型定义、API路由)看起来都没问题,只要修改页面的<script>标签就能解决这个错误啦!

备注:内容来源于stack exchange,提问作者Noriaki Takamizawa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:38:00