【发布时间】:2021-09-09 00:30:25
【问题描述】:
我们正在从 SPA 切换到静态生成,并且遇到了中间件问题。
基本上,Nuxt 静态渲染时,中间件首先运行在构建服务器上,然后在每个页面导航客户端之后运行。重要的一点是中间件不在第一页加载时运行客户端。这是讨论here
我们通过创建一个使用相同代码的插件来解决某些用例的问题,因为插件在第一个客户端加载时运行。
但是,此模式不适用于此用例。以下是我们要使用的中间件示例:
// middleware/authenticated.js
export default function ({ store, redirect }) {
// If the user is not authenticated
if (!store.state.authenticated) {
return redirect('/login')
}
}
// Inside a component
<template>
<h1>Secret page</h1>
</template>
<script>
export default {
middleware: 'authenticated'
}
</script>
本例取自directly from the Nuxt docs。
当静态呈现时,在第一个页面加载时不会调用此中间件,因此用户最终可能会在登录之前点击他们的仪表板,这会导致问题。
要将其添加到插件中,我能想到的唯一方法是添加authenticated_routes 的列表,插件可以对其进行比较并查看用户是否需要进行身份验证。
不过,该解决方案的问题在于,我们需要维护一个相对复杂的已验证页面列表,而动态路由会使情况变得更糟,您需要匹配正则表达式。
所以我的问题是:我们如何运行我们的authenticated 中间件,它是特定于页面的,而不需要维护一些需要验证的路由列表?有没有办法让中间件与插件内的路由相关联?
【问题讨论】:
-
您是否尝试在页面或布局上运行中间件?此外,还可以使用像
beforeRouteEnter这样的路由器保护。同时,据我所知,中间件应该在target: staticcase 中工作。你有ssr: truebtw 吗? -
我们将 SSR 设置为 true,并以静态为目标。我已经用一个链接更新了第二段,该链接解释了就 Nuxt 而言,这是按预期工作的。我们正在专门寻找一种解决中间件/插件组合需求的方法。是的,target=static, ssr=true,它在构建服务器上运行中间件来加载第一个页面,而不是在客户端。
-
大家好,你们找到解决方案了吗?我也有同样的情况。
标签: vue.js authentication nuxt.js middleware