Adonis 6集成WebSocket.io遇阻,请求技术指导
Adonis 6 集成 Socket.io 完整方案
核心导入问题修正
Adonis 6 重构了核心模块结构,你提到的 import { AdonisServer } from '@adonisjs/core/app' 在Adonis 6中已被废弃。替代方案是直接从 @adonisjs/core/server 导入内置的服务器实例,或通过应用服务获取HTTP服务器:
// 方式1:直接导入server实例 import { server } from '@adonisjs/core/server' // 方式2:通过应用服务获取 import app from '@adonisjs/core/services/app' const httpServer = app.get('server')
完整集成步骤
安装依赖
安装Socket.io及类型定义:npm install socket.io npm install -D @types/socket.io初始化Socket.io
在start/server.ts文件中添加Socket.io初始化逻辑(Adonis 6启动时会自动加载该文件):import { server } from '@adonisjs/core/server' import { Server } from 'socket.io' // 基于Adonis的HTTP服务器实例创建Socket.io服务 const io = new Server(server.instance, { // 可选:配置Socket.io选项,比如CORS cors: { origin: '*', // 根据实际生产环境调整 credentials: true } }) // 监听客户端连接事件 io.on('connection', (socket) => { console.log(`客户端已连接: ${socket.id}`) // 监听自定义消息事件 socket.on('client:message', (payload) => { console.log('收到客户端消息:', payload) // 向发送者回复消息 socket.emit('server:response', `已接收消息:${payload}`) // 向所有客户端广播消息(除发送者外) socket.broadcast.emit('server:broadcast', `${socket.id} 说:${payload}`) }) // 监听客户端断开事件 socket.on('disconnect', () => { console.log(`客户端已断开: ${socket.id}`) }) })前端连接示例
前端项目中安装socket.io-client后,即可建立连接:import { io } from 'socket.io-client' const socket = io('http://localhost:3333') socket.on('connect', () => { console.log('成功连接到服务器') socket.emit('client:message', 'Hello Adonis 6 Socket.io!') }) socket.on('server:response', (data) => { console.log('服务器回复:', data) }) socket.on('server:broadcast', (data) => { console.log('广播消息:', data) })
常见问题处理
- CORS错误:如果前端出现跨域问题,除了在Socket.io配置中设置CORS,还需确保Adonis 6的
config/cors.ts配置允许对应的请求来源:export default { enabled: true, origin: ['http://localhost:5173'], // 替换为你的前端地址 methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'], headers: true, credentials: true, maxAge: 90, } - 服务器实例获取失败:确保代码在Adonis应用启动流程中执行,
start/server.ts是官方推荐的服务初始化位置,不要在其他未被自动加载的文件中执行。
内容的提问来源于stack exchange,提问作者LarvePoire
相关产品推荐
相关产品推荐

