Nuxt 中间件调用两次

Posted

技术标签:

【中文标题】Nuxt 中间件调用两次【英文标题】:Nuxt middleware call two times 【发布时间】:2021-12-07 14:57:12 【问题描述】:

我有一个 Nuxt s-s-r 应用程序。页面上有一个中间件应该检查​​查询字符串中的令牌,它不存在然后重定向到带有令牌的新 url。似乎这个中间件在同一个 url 下被调用了两次,但令牌检查的结果不同。我不明白为什么它被调用两次并且相同条件的结果不同。

/** Create DB item and return token */
async middleware(context) 
    const token = context.route.query.token;
    console.log('token');
    console.log(token);  // First one is ok but the second is undefined.
    if (!token) 
        const result = await context.$api.campaigns.createNewShare();
        context.redirect('name': 'campaigns-new', 'query': token: result.data.token);
    
,

这是请求流程的截图:

【问题讨论】:

【参考方案1】:

基本上因为您使用的是 s-s-r,该中间件将从服务器调用一次,从客户端调用一次,因此您会看到重复的日志。

您可以使用if (process.client) 阻止中间件在服务器上运行,或者使用if (process.server) 阻止中间件在客户端运行。

例子:

/** Create DB item and return token */
async middleware(context) 
    if (process.client)        // or !process.server if you prefer
        const token = context.route.query.token;
        console.log('token');
        console.log(token);  // First one is ok but the second is undefined.
        if (!token) 
            const result = await context.$api.campaigns.createNewShare();
            context.redirect('name': 'campaigns-new', 'query': token: result.data.token);
        
    

【讨论】:

如果我添加了 process.client 条件,它根本不会被调用。 可能是它已经只在服务器端运行并且中间件被调用了两次,因为加载的第一个页面没有令牌,然后重定向到另一个/相同路由(会再次触发中间件)?

以上是关于Nuxt 中间件调用两次的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 和 nuxt 进行服务器和客户端 API 调用的不同 baseURL

Nuxt 3 中与 Nuxt 2 中的“匿名中间件”最接近的等价物是啥?

NUXT 中间件中未定义 Vuex 存储

如何在特定页面禁用中间件,nuxt 中间件

带生成的 Nuxt 服务器中间件

Nuxt Firebase 身份验证中间件