我正在Nuxt3应用程序中创建一个Socket.IO实现.当我处于开发模式时,WebSocket可以工作,但我收到了这个错误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'
    ]
})

下面是我的模块/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文件,它有一个简单的Socket Emit事件按钮实现

<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

推荐答案

我找到了问题的解决方案,由于某种原因,Nuxt3在产品启动时没有执行我的Socket.IO模块.我使用serverHandler(以前的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'
        }
    ]
}) 

这是我的服务器-Midleware/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()
}

这是我的申请表.

<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"
  }
}

Javascript相关问答推荐

访客柜台的风格React.js

除了在Angular 16中使用快照之外,什么是可行且更灵活的替代方案?

使用CDO时如何将Vue组件存储在html之外?

无法将nPM simplex-noise包导入在JS项目中工作

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

类型自定义lazy Promise. all

在nextjs服务器端api调用中传递认证凭证

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

引用在HTMLAttributes<;HTMLDivElement>;中不可用

如何在 cypress 中使用静态嵌套循环

我的角模板订阅后不刷新'

覆盖TypeScrip中的Lit-Element子类的属性类型

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

无法避免UV:flat的插值:非法使用保留字"

未捕获的运行时错误:调度程序为空

P5JS-绘制不重叠的圆

为什么我看到的是回复,而不是我的文档?

为什么我不能使用其同级元素调用和更新子元素?