我的使用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实例中?还是有更好的方法实现我的目标?
谢谢
答案 0 :(得分:1)
我最终在nuxtjs中间件之前将连接器注入了Express服务器。这样,它就可以在上下文的req对象上使用。该插件可以在执行SSR时使用它,否则会创建一个新的连接器。