如何在SSR模式下重用连接?

时间:2019-11-07 16:49:50

标签: nuxt.js

我的使用SSR的NuxtJS应用程序需要联系需要身份验证的数据服务器。他们有一个客户端库(我们称之为客户端)。

每次用户重新加载页面时,SSR都会打开一个新连接。我希望能够使用单个连接并节省重新连接和身份验证的费用。

我编写了一个插件,用于创建客户端连接器的实例并将其注入到上下文和应用程序中。对于客户端而言,这很好,但是对于服务器端,连接器实例被泄漏。

我当前的解决方案是挂接到render:renderDone事件并在那里关闭连接。避免了资源泄漏,但是我仍然要付出每次用户请求页面时重新连接和认证的费用。

该插件创建一个连接并将该连接器注入应用程序:

export default async (context, inject) => {
  const client = <SOME CLIENT LIBRARY>
  await client.login()
  inject('ds', client)
}

中间件将连接器复制到renderer.req:

export default function (context) {
  if (context.req) context.req.$ds = context.app.$ds
}

服务页面后,清理挂钩将关闭连接。

function render(nuxtConfig) {
  return {
    routeDone(url, result, context) {
      if (context.req.$ds) context.req.$ds.close()
    }
  }
}

我希望能够在服务器端注入连接器的单个实例,同时将现有逻辑保留在客户端。

我尝试在nuxt:ready事件上创建连接器

  async ready(nuxt) {
    const client = deepstream(process.env.DEEPSTREAM_URL)
    await client.login()
    // What to do with the client?
  },

但是在插件的位置,我看不到任何可以使用的内容。换句话说,我可以在哪里将客户端对象放入ready回调中,以便可以在插件中检索该对象并将其注入Vue实例中?还是有更好的方法实现我的目标?

谢谢

1 个答案:

答案 0 :(得分:1)

我最终在nuxtjs中间件之前将连接器注入了Express服务器。这样,它就可以在上下文的req对象上使用。该插件可以在执行SSR时使用它,否则会创建一个新的连接器。