繁体   English   中英

Nuxt.js 2 - 如何访问服务器中间件中的钩子实例

[英]Nuxt.js 2 - how to access hook instance in server middleware

让我先说这是 Nuxt 的一个领域,我在这方面的经验几乎为零,而且网上关于它的资源似乎很少,甚至 Nuxt 的文档也缺乏。 因此,请随时纠正我在这篇文章中所做的任何错误假设。

我在模块的钩子中运行 websocket 侦听器,在服务器中间件中运行常规 Express api 服务器。 他们自己似乎工作没有问题,但我似乎无法正确访问 api 端点之一中的 websocket 侦听器,这样如果 Z8A5DA52ED126447D359E70C05721AAZ 订阅客户端可以通知订阅 IAAZ 我来给你展示。

这是我的 websocket 监听器钩子模块:

// @/modules/ws.js

const WebSocket = require('ws')
const wss = new WebSocket.Server({ noServer: true })

wss.on('connection', ws => {
  console.log('client connected', wss.clients.size)

  ws.on('message', data => {
    console.log('received:', data)
    data = JSON.parse(data)

    if(data.type === 'connection') {
      ws.clientId = data.id
      return ws.send(JSON.stringify({ type: 'connection', status: 'success', id: ws.clientId }))
    }
  })
})

export default function () {
  this.nuxt.hook('listen', server => {
    server.on('upgrade', (request, socket, head) => {
      wss.handleUpgrade(request, socket, head, ws => {
        wss.emit('connection', ws)
      })
    })
  })
}

然后这是我的 api 服务器:

// @/server-middleware/index.js

const express = require('express')
const app = express()

app.post('/test-route', (req, res) => {
  console.log('connection received')
  // here I'd now like to access wss to notify subscribed clients
  res.json({ status: 'success' })
})

module.exports = app

然后在nuxt.config.js它们全部连接起来

...
modules: ['@/modules/ws'],
serverMiddleware: ['@/server-middleware/index'],
...

首先,我担心我会走错路,我应该以某种方式将 api 服务器粘贴到modules/ws.js ,然后一切都应该可以在那里访问,但我不知道如何接管快递,这样它仍然有效,所以如果你在这里有建议,我会非常感激。

除此之外,我只想访问在server-middleware/index.jsmodules/ws.js中实例化的wss object 因为理论上我应该仍然能够将消息推送到订阅的客户端,对吗? 但是我该怎么做呢? 我尝试直接require从 ws.js 导出默认的ws.js ,但这似乎只返回 function 而不是wss实例。 我还尝试查看中间件中的this.nuxt object ,与钩子模块中的相同,但仅返回undefined

所以现在我没有东西可以尝试了,而且这一切对我来说是多么陌生,我什至无法想象任何其他可能与之相关的东西。 任何有关这方面的建议将不胜感激。

Nuxt.js 版本 2.15.7,FWIW

一种可能的方法是将 WebSocket 服务器分离到不同的文件中以供以后使用。

例子:

// @/modules/ws/wss.js

const WebSocket = require('ws')
const wss = new WebSocket.Server({ noServer: true })

wss.on('connection', ws => {
  ...
})

module.exports = {
  handleUpgrade (request, socket, head) {
    wss.handleUpgrade(request, socket, head, ws => {
      wss.emit('connection', ws)
    })
  },

  getActiveClients () {
    return [...wss.clients].filter(
      client => client.readyState === WebSocket.OPEN
    )
  }
}
// @/modules/ws/index.js

const wss = require('./wss')

export default function () {
  this.nuxt.hook('listen', server => {
    server.on('upgrade', wss.handleUpgrade)
  })
}

然后在您的服务器中间件中使用它:

// @/server-middleware/index.js

const express = require('express')
const wss = require('../modules/ws/wss')

const app = express()

app.get('/broadcast', (req, res) => {
  for (let client of wss.getActiveClients()) {
    client.send('broadcast!')
  }

  res.json({ status: 'success' })
})

module.exports = app

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM