如何使用 Nuxt ServerMiddleware 和 Apollo GraphQL 处理 301 重定向

Posted

技术标签:

【中文标题】如何使用 Nuxt ServerMiddleware 和 Apollo GraphQL 处理 301 重定向【英文标题】:How to process 301 redirects with Nuxt ServerMiddleware and Apollo GraphQL 【发布时间】:2020-02-08 03:11:26 【问题描述】:

我目前正在构建一个 Vue / Nuxt 应用程序以及修改后的 Saleor 安装以在线销售产品。

当我们从现有系统迁移时,我们需要能够处理从旧网站 URL 到新网站 URL 的 301 重定向。

我已修改 API 以响应以下 GraphQL 查询。

export const CHECK_REDIRECTS_QUERY = gql`
  query Redirect($oldPath: String) 
    redirect(oldPath: $oldPath) 
      oldPath
      newPath
    
  
`

从this recommendation 开始,我在 ~/serverMiddleware/redirect.js 文件中创建了以下代码

import  CHECK_REDIRECTS_QUERY  from '~/graphql/navigation/queries'

export default function(req, res, next) 
  console.log('redirects middleware')
  // context.userAgent = process.server ? context.req.headers['user-agent'] : navigator.userAgent
  this.$apollo
    .query(
      query: CHECK_REDIRECTS_QUERY,
      variables: 
        oldPath: '/test/11/old/'
      
    )
    .then(( data ) => 
      if (data.redirect.newUrl !== '') 
        res.writeHead(301,  Location: data.redirect.newUrl )
        res.end()
      
    )

我还把它添加到我的 nuxt.config.js 文件中,如下所示:

 ... 
 serverMiddleware: ['~/serverMiddleware/redirect.js'],
 ...

这不起作用,但我不仅没有得到重定向,我希望函数开头的 console.log 也不会触发。

此外,我还尝试使用 github 推荐中编写的代码,这非常“易碎”,在大约 50 次服务器重启中可能会触发两次。

我没有收到任何关于 apollo 不能在服务器中间件中使用的控制台通知,并且站点的其余部分似乎运行正常。

另外,为了澄清,我假设中间件应该在每个页面上自动触发,而不需要从组件手动调用?

【问题讨论】:

如何访问服务器中间件中的 nuxt 上下文(this)来查询 apollo?我越来越不确定,根据 nuxt docs Nuxt Context is not available in server middleware? 【参考方案1】:

组织重定向的最简单方法是使用Redirect Module

【讨论】:

点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们在未来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留指向原始解决方案网站的链接引用。见:How do I write a good answer? Petes 问题需要根据我的理解重定向模块不支持的 apollo。【参考方案2】:

终于在nuxtjs's github找到了解决办法

res.writeHead(301,  Location: redirect.to )
res.end()

完成!

【讨论】:

很好的发现! ? 很好 :) 看着自己应用这个。到目前为止,如果页面遇到 404,我们的错误页面一直在查询我们的重定向 API。但是,事实证明,一些爬虫未能找到它。但是我对您的解决方案担心的是,无论是否命中 404,它都会在每个页面上触发,这意味着它总是会导致性能问题。您是否发现这会导致任何问题?

以上是关于如何使用 Nuxt ServerMiddleware 和 Apollo GraphQL 处理 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest 在 Nuxt 中测试组件时如何添加/模拟 Nuxt Auth 库

如何使用 golang 和 nuxt?

如何在 Nuxt 中使用 webpack 开发代理

如何在 Nuxt 插件中使用错误功能?

如何在另一个站点中使用 NUXT 组件

如何让 postcss 配置与 Nuxt 一起使用?