NuxtJS Express SocketIO JWT — эмиссия останавливается после полной загрузки сервера

#express #webpack #socket.io #nuxt.js

Вопрос:

Поэтому я хочу внедрить SocketIO в свое приложение Nuxt. Я использую Nuxt, Express, Axios, JWT, и теперь я хочу добавить SocketIO

После многих часов поиска, поиска и соскабливания фрагментов кода вместе у меня все получилось.

Мой сервер index.js:

 /* global base_dir abs_path */
require('dotenv').config()

global.base_dir = __dirname
global.abs_path = function(path) {
    // eslint-disable-next-line camelcase
    return base_dir   path
}
global.include = function(file) {
    return require(abs_path('/server/'   file))
}

const bodyParser = require('body-parser')
const cors = require('cors')
const morgan = require('morgan')
const helmet = require('helmet')
// const jwt = require('jsonwebtoken')
const socketioJwt = require('socketio-jwt')

const consola = require('consola')
const { Nuxt, Builder } = require('nuxt')
const app = require('express')()
const sio = require('socket.io')

app.use(require('express-status-monitor')({ path: '/admin/q/status' }))
// Import and Set Nuxt.js options
require('./server/auth/passport')

const config = require('./nuxt.config.js')
const { portalSeq } = require('./server/models')

config.dev = process.env.NODE_ENV !== 'production'

const api = require('./server/api')

// Init Nuxt.js
const nuxt = new Nuxt(config)

const { host, port } = nuxt.options.server

nuxt.ready()
// Build only in dev mode
if (config.dev) {
    const builder = new Builder(nuxt)
    builder.build()
}

app.use(helmet())
app.use(morgan('combined'))
app.use(bodyParser.json({ limit: '50mb', extended: true }))
app.use(bodyParser.urlencoded({ extended: true, limit: '50mb' }))
app.use(cors())

app.use('/api', api)

// Give nuxt middleware to express
app.use(nuxt.render)

// portalSeq.sync({ force: false }).then(() => {
const server = app.listen(port, host)
consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
})
// })
// Listen the server

const io = sio.listen(server)

let i = 0
// Broadcast "tick" event every second
// Or do whatever you want with io ;)
setInterval(() => {
    i  
    io.emit('tick', i)
    console.log('ticks emited :', i)
}, 1000)

io.on(
    'connection',
    socketioJwt.authorize({
        secret: process.env.PRIVATE,
        timeout: 15000 // 15 seconds to send the authentication message
    })
)
    .on('authenticated', (socket) => {
        // this socket is authenticated, we are good to handle more events from it.
        console.log(`hello! ${socket.decoded_token.name}`)
    })
    .on('test', (data) => {
        console.log(data)
        io.emit('test', data)
    })

console.log(io)

console.log('socket.io is gestart, dendeze ier')
 

Мой клиентский тест.vue:

 <template>
    <div>
        <h1>Testing api</h1>
        <v-text-field v-model="latestTickId" />
        <v-btn @click="test" />
    </div>
</template>

<script>
// import socket from '../plugins/socket.io'
import io from 'socket.io-client'
/* eslint-disable no-undef */
export default {
    data() {
        return {
            latestTickId: 0,
            sessionStorage: null
        }
    },
    mounted() {
        const token = this.$store.state.user.token

        const socket = io.connect('http://192.168.41.15:3000')
        socket.on('connect', () => {
            socket
                .emit('authenticate', { token }) // send the jwt
                .on('authenticated', () => {
                    // do other things
                })
                .on('unauthorized', (msg) => {
                    console.log(`unauthorized: ${JSON.stringify(msg.data)}`)
                    throw new Error(msg.data.type)
                })
        })
        socket.on('tick', (tickId) => {
            this.latestTickId = tickId
        })
        socket.on('test', (data) => {
            console.log('incoming testdata: ', data)
        })
    },
    methods: {
        test() {
            socket.emit('test', { id: 'abc123' })
        }
    }
}
</script>
 

Когда я создаю свое приложение, это мой журнал за первые секунды:

 socket.io is gestart, dendeze ier
(node:16840) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log
(Use `node --trace-deprecation ...` to show where the warning was created)
√ Builder initialized                                                                                                                                                                           23:00:58
hello! undefined
√ Nuxt files generated                                                                                                                                                                          23:00:58

√ Client
  Compiled successfully in 12.94s

ticks emited : 1
Server is ready to take our messages
ticks emited : 2
ticks emited : 3
hello! undefined
ticks emited : 4
ticks emited : 5
ticks emited : 6
hello! undefined
ticks emited : 7
ticks emited : 8
hello! undefined
ticks emited : 9
ticks emited : 10
ticks emited : 11
 

мой результат, галочки получены:
результат первые секунды

затем веб-пакет вступает в действие:

Журнал терминала

и клиент перестает получать эмиссии…

результат после перезагрузки веб-пакета

Что я делаю не так? Спасибо вам за ваш совет.

пс. Я работаю над этим 3 дня, это сводит меня с ума, я действительно много старался!

Ответ №1:

Для будущих ссылок. я решил эту проблему. Экспресс и ввод-вывод не могут работать на одном и том же порту.

вместо

 const io = sio.listen(server)
 

Я использовал (на сервере)

 const io = sio.listen(3001)
 

и для клиента

 const socket = io(':3001')