关于在Nest.js中使用socket.io

简介

本案例服务端以Nest官方模板,客户端以简单的Vue3+VueCli构建的(未详细说明如何构建,若有不会的可以自行查询网络资源),主要使用socket.io实现前后端简单通信。

一、Nest.js基本安装与使用

1.下载Nest.js脚手架

这里使用的是pnpm包管理工具

css 复制代码
$ pnpm i -g @nestjs/cli

2. 新建项目文件

project-name 设置成自己的项目名字

arduino 复制代码
$ nest new project-name

3.生成控制器、模块、微服务(逻辑层),这里以user为例

sql 复制代码
$ nest g module user
$ nest g controller user --no-spec
$ nest g service user --no-spec

4.代码规范配置

在根目录中找到并打开.prettierr文件写入如下:

js 复制代码
{
  "singleQuote": true,
  "trailingComma": "all",
  "arrowParens": "always",
  "bracketSameLine": true,
  "bracketSpacing": true,
  "embeddedLanguageFormatting": "auto",
  "htmlWhitespaceSensitivity": "css",
  "insertPragma": false,
  "jsxSingleQuote": false,
  "printWidth": 120,
  "proseWrap": "never",
  "quoteProps": "as-needed",
  "requirePragma": false,
  "semi": false,
  "tabWidth": 2,
  "useTabs": false,
  "vueIndentScriptAndStyle": false,
  "singleAttributePerLine": false
}

二、安装依赖项

1.在服务端中安装依赖项

安装socket.io至少需要 Node.js 10

ruby 复制代码
$ pnpm i @nestjs/websockets @nestjs/platform-socket.io

注:@nestjs/platform-socket.io(^10.2.4)中集成了socket.io 4.x

2.在客户端中安装依赖项

ruby 复制代码
 $ pnpm i socket.io-client@2.5.0
 $ pnpm i socket.io@2.4.0

注意:不同版本可能会有差异,具体查看官网的版本适配表这里附上客户端安装 | Socket.IO

三、socket.io的配置

1.服务端

使用官方cli工具在项目中生成一个socket模块

perl 复制代码
$ nest g res socket --no-spec

选择第四个websockets

是否生成增删改查的模块,我这里选择的是生成

自此就生成了如图的目录结构

以下是服务端具体代码

socket.gateway.ts 复制代码
import {
  WebSocketGateway,
  SubscribeMessage,
  MessageBody,
} from '@nestjs/websockets';
import { SocketService } from './socket.service';
import { CreateSocketDto } from './dto/create-socket.dto';
import { UpdateSocketDto } from './dto/update-socket.dto';
import { Socket } from 'dgram';
@WebSocketGateway(3001, {
  allowEIO3: true,//协议前后端版本要一致
  //后端解决跨域
  cors: {
    origin: 'http://localhost:8082',//这里不要写*,要写具体,否则会出现跨域问题
    credentials: true,
  },
})
export class SocketGateway {
  constructor(private readonly socketService: SocketService) {}
  msgList: string[] = [];
  @SubscribeMessage('socketTest')
  socketTest(@MessageBody() data: any) {
    // 转发信息
    let forwardMsg: String = '服务端=>客户端';
    return {
      //通过return返回客户端转发事件
      event: 'forward',
      data: forwardMsg, //data后面跟携带数据
    };
  }
  //接收并处理来自客户端的消息
  @SubscribeMessage('toServer')
  toServer(client: Socket, data: string) {
    console.log(data);
    client.emit('toServer', '这是一条发送给客户端的消息');
  }
 //以下代码本文不会介绍
 @SubscribeMessage('createSocket')
  create(@MessageBody() createSocketDto: CreateSocketDto) {
    return this.socketService.create(createSocketDto);
  }

  @SubscribeMessage('findAllSocket')
  findAll() {
    return this.socketService.findAll();
  }

  @SubscribeMessage('findOneSocket')
  findOne(@MessageBody() id: number) {
    return this.socketService.findOne(id);
  }

  @SubscribeMessage('updateSocket')
  update(@MessageBody() updateSocketDto: UpdateSocketDto) {
    return this.socketService.update(updateSocketDto.id, updateSocketDto);
  }

  @SubscribeMessage('removeSocket')
  remove(@MessageBody() id: number) {
    return this.socketService.remove(id);
  }
}

2.客户端

客户端配置代码如下

vue.config.js 复制代码
const { defineConfig } = require('@vue/cli-service')
const webpack = require('webpack')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,//关闭语法检查
  //文件名哈希
  filenameHashing: true,
  publicPath: './',
  outputDir: 'dist',
  assetsDir: 'static',
  devServer: {
    port: 8082,
    open: true,
    headers: {
      'Access-Control-Allow-Origin': '*',
    }
    ,
    //设置代理,前端解决跨域
    proxy: {
      '/api': {
        target: 'http://localhost:8080/',//这里填入你要请求的接口的前缀
        ws: true,//代理websocked
        changeOrigin: true,//虚拟的站点需要更管origin
        secure: false,//是否https接口
        pathRewrite: {
          '^/api': ''//重写路径
        }
      }

    }
  },
  chainWebpack: config => {
    config.plugin('provide').use(webpack.ProvidePlugin, [{
      $: 'jquery',
      jquery: 'jquery',
      jQuery: 'jquery',
      'window.jQuery': 'jquery'
    }]),
      config.output.globalObject('this')
  },
})

3.控制台和终端中查看

四、其他可能出现的问题

1.连接问题

这里附上官网的地址,里面写得挺详细的 解决连接问题 | Socket.IO

2.版本不匹配问题

这里附上版本适配表

相关推荐
亮子AI10 天前
【NestJS】为什么return不返回客户端?
前端·javascript·git·nestjs
小p11 天前
nestjs学习2:利用typescript改写express服务
nestjs
Eric_见嘉17 天前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
XiaoYu200225 天前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu20021 个月前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄1 个月前
NestJS 调试方案
后端·nestjs
当时只道寻常1 个月前
NestJS 如何配置环境变量
nestjs
濮水大叔1 个月前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi1 个月前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs