Nuxt 3 在中间件中使用可组合

Nuxt 3 use composable in middleware

我想通过检查用户是否登录来保护路由,但是:

  1. 我无法读取可组合值,
  2. 我不确定我的中间件是否得到了正确的主体。

我的可组合项:

// composable/useAuth.js
const useAuth = () => {

  // user login, sign out, sign up logic

  const isLoggedIn = () => {
    return !!user.value
  }

  return {
    isLoggedIn
  }
}

export default useAuth

我的中间件:

// middleware/check-admin.js
export default defineNuxtRouteMiddleware((to, from) => {
  const { isLoggedIn } = useAuth()

  console.log(isLoggedIn); // <- Screenshot

  if (isLoggedIn) {
    return navigateTo(`/albums/${to.params.id}/edit`)
  } else {
    return navigateTo('/')
  }
})

我的控制台记录了一个方法体。但我期待一个虚假或真实的价值:


问题:

您返回了函数,但绝不会在末尾使用 () 调用它。

这样试试:

export default defineNuxtRouteMiddleware((to, from) => {
  const { isLoggedIn } = useAuth()

  console.log(isLoggedIn()); // <- Screenshot
  // `from.name === login` will trigger rediraction for example if user want to login but he is already logged in.
  // form.name will be necesery if you use suffix `.global` in file name.
  if (isLoggedIn() && to.params.id && !from.params.id && from.name === `login`) {
    return navigateTo(`/albums/${to.params.id}/edit`)
  }
  if (!isLoggedIn() && form.params.id) {
    return abortNavigation()
  }
})

使用 to 值了解用户想要导航的位置。

如果您没有在中间件文件中使用 .global 后缀,您可以选择在组件中的何处使用中间件。

<script setup>
definePageMeta({
  middleware: ["auth"]
  // or middleware: 'auth'
})
</script>