【问题标题】:Socket.io websocket not working in Nuxt 3 when in productionSocket.io websocket 在生产时无法在 Nuxt 3 中工作
【发布时间】:2023-01-10 23:02:35
【问题描述】:

我正在 Nuxt 3 应用程序中创建一个 socket.io 实现。当我处于开发模式时,websockets 可以工作,但我收到此错误 error message。我正在使用 Nuxt 版本 nuxt v3.0.0-rc.8,这是我的 nuxt.config.ts 文件的样子:

import { defineNuxtConfig } from 'nuxt';

// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
    css: [
        'primevue/resources/themes/saga-blue/theme.css',
        'primevue/resources/primevue.css',
        'primeicons/primeicons.css'
    ],
    build: {
        transpile: [
            'primevue'
        ],
    },
    modules: [
        './modules/socket'
    ]
})

这是我的 modules/sockets.ts 文件的样子:

import { Server } from 'socket.io';
import { defineNuxtModule } from '@nuxt/kit';

export default defineNuxtModule({
  setup(_, nuxt) {
    console.log('Socket Read');
    
    nuxt.hook('listen', (server) => {
      console.log('Socket listen', server.address(), server.eventNames())
      const io = new Server(server)

      nuxt.hook('close', () => io.close())

      io.on('connection', (socket) => {
        console.log('Connection', socket.id)
      })

      io.on('connect', (socket) => {
        socket.emit('message', `welcome ${socket.id}`)
        socket.broadcast.emit('message', `${socket.id} joined`)

        socket.on('message', function message(data: any) {
          console.log('message received: %s', data)
          socket.emit('message', { data })
        })

        socket.on('disconnecting', () => {
          console.log('disconnected', socket.id)
          socket.broadcast.emit('message', `${socket.id} left`)
        })
      })
    });
  },
});

这是我的 plugins/socket.client.ts 文件的样子

import io from 'socket.io-client';

export default defineNuxtPlugin(() => {
    const socket = io('http://localhost:3000');

    return {
        provide: {
            io: socket
        }
    }
});

这是我的 app.vue 文件,它具有套接字发射事件的简单按钮实现

<template>
   <button @click="sendMessage" class="btn btn-primary">Send Message</button>
</template>

<script setup lang="ts">
  const { $io } = useNuxtApp();

  const sendMessage = () => {
    console.log('Click');
    $io.emit("message", "new message sent");
  };
  
</script>

这是我的 package.json 文件

{
"private": true,
  "scripts": {
    "build": "nuxi build",
    "dev": "nuxi dev",
    "generate": "nuxi generate",
    "preview": "nuxi preview",
    "start": "node .output/server/index.mjs"
  },
  "devDependencies": {
    "nuxt": "^3.0.0-rc.8"
  },
  "dependencies": {
    "primeflex": "^3.2.1",
    "primeicons": "^5.0.0",
    "primevue": "^3.16.1",
    "socket.io": "^4.5.2",
    "socket.io-client": "^4.5.2"
  }
}

Here is a replit playground that I set up

【问题讨论】:

  • 那么,它在开发中也不起作用吗?也许你需要在这里使用 HTTPS?
  • 它在开发模式下完美运行,但是一旦我构建项目,websockets 就会停止工作并开始给我一个错误
  • 所以@kissu 我尝试升级到 nuxt v3.0.0-rc.9,我从控制台收到了一条新警告警告 autoImports:extend 挂钩已弃用。使用 @nuxt/kit 中的 addImports() 或 imports:extend with nuxt>=3.0.0-rc.9.
  • 你的制作地址是http://localhost:3000吗?
  • @ITgoldman 是的,地址是localhost:3000

标签: javascript socket.io nuxtjs3


【解决方案1】:

我找到了解决问题的方法,出于某种原因,Nuxt 3 在生产启动时没有执行我的 socket.io 模块。我使用 serverHandlers(以前称为 serverMiddleware)创建了自己的解决方案,这就是我所做的。

这是我的 nuxt.config.ts 文件

import { defineNuxtConfig } from 'nuxt';

// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
    css: [
        'primevue/resources/themes/saga-blue/theme.css',
        'primevue/resources/primevue.css',
        'primeicons/primeicons.css'
    ],
    build: {
        transpile: [
            'primevue'
        ],
    },
    serverHandlers: [
        {
            route: '/ws',
            handler: '~/server-middleware/socket'
        }
    ]
}) 

这是我的服务器中间件/socket.ts

import { Server } from 'socket.io';

const io = new Server(3001, {
  cors: {
      origin: '*',
  }
});

io.on('connection', (socket) => {
  console.log('Connection', socket.id)
})

io.on('connect', (socket) => {
  socket.emit('message', `welcome ${socket.id}`)
  socket.broadcast.emit('message', `${socket.id} joined`)

  socket.on('message', function message(data: any) {
    console.log('message received: %s', data)
    socket.emit('message', { data })
  })

  socket.on('disconnecting', () => {
    console.log('disconnected', socket.id)
    socket.broadcast.emit('message', `${socket.id} left`)
  })
});

export default function (req, res, next) {
  res.statusCode = 200
  res.end()
}

这是我的 app.vue

<template>
   <button @click="sendMessage" class="btn btn-primary">Send Message</button>
</template>

<script setup lang="ts">
  const { $io } = useNuxtApp();

  const sendMessage = () => {
    console.log('Click');
    $io.emit("message", "new message sent");
  };
  
</script>

这是我的 package.json

{
"private": true,
  "scripts": {
    "build": "nuxi build",
    "dev": "nuxi dev",
    "generate": "nuxi generate",
    "preview": "nuxi preview",
    "start": "node .output/server/index.mjs"
  },
  "devDependencies": {
    "nuxt": "^3.0.0-rc.8"
  },
  "dependencies": {
    "primeflex": "^3.2.1",
    "primeicons": "^5.0.0",
    "primevue": "^3.16.1",
    "socket.io": "^4.5.2",
    "socket.io-client": "^4.5.2"
  }
}

【讨论】:

  • 它显示路径 socket.io not found 并且它不起作用。你也遇到同样的错误吗?你怎么修好它的?
  • 你好,你能用你的代码创建一个 StackBlitz 吗
【解决方案2】:

所以我设法修复了错误。我正在使用 Webseocket 服务器 (ws) 而不是 socket.io。我在 server/middleware/socket.ts 中创建了一个服务器中间件

该中间件利用 Nuxt 服务器创建套接字服务器。

这是git repo

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2017-04-09
    相关资源
    最近更新 更多