From 960ee31659bfff1d5c53d507ff3b3a4d4afbca88 Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Sat, 12 Nov 2022 19:36:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0`websocket`=20?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++ pnpm-lock.yaml | 60 +++++++++++++++++++++++++--- src/app.ts | 3 ++ src/router/{api/mysql.ts => http.ts} | 11 +++-- src/server.ts | 29 +++++++++++++- src/utils/{initMysql.ts => mysql.ts} | 0 6 files changed, 93 insertions(+), 14 deletions(-) rename src/router/{api/mysql.ts => http.ts} (97%) rename src/utils/{initMysql.ts => mysql.ts} (100%) diff --git a/package.json b/package.json index 4c07e30..006990f 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,20 @@ "author": "xiaoxian521", "license": "ISC", "devDependencies": { + "@types/body-parser": "^1.19.2", "@types/express": "^4.17.14", + "@types/express-ws": "^3.0.1", "@types/formidable": "^2.0.5", "@types/jsonwebtoken": "^8.5.9", "@types/node": "^18.11.9", + "@types/ws": "^8.5.3", "body-parser": "^1.20.1", "dayjs": "^1.11.6", "dotenv": "^16.0.3", "esno": "^0.16.3", "express": "^4.18.2", "express-swagger-generator": "^1.1.17", + "express-ws": "^5.0.2", "formidable": "^2.0.1", "jsonwebtoken": "^8.5.1", "mysql2": "^2.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f23095c..0b55e58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16 +1,20 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: + '@types/body-parser': ^1.19.2 '@types/express': ^4.17.14 + '@types/express-ws': ^3.0.1 '@types/formidable': ^2.0.5 '@types/jsonwebtoken': ^8.5.9 '@types/node': ^18.11.9 + '@types/ws': ^8.5.3 body-parser: ^1.20.1 dayjs: ^1.11.6 dotenv: ^16.0.3 esno: ^0.16.3 express: ^4.18.2 express-swagger-generator: ^1.1.17 + express-ws: ^5.0.2 formidable: ^2.0.1 jsonwebtoken: ^8.5.1 mysql2: ^2.3.3 @@ -22,23 +26,27 @@ specifiers: winston: ^3.8.2 devDependencies: + '@types/body-parser': 1.19.2 '@types/express': 4.17.14 + '@types/express-ws': 3.0.1 '@types/formidable': 2.0.5 '@types/jsonwebtoken': 8.5.9 '@types/node': 18.11.9 + '@types/ws': 8.5.3 body-parser: 1.20.1 dayjs: 1.11.6 dotenv: 16.0.3 esno: 0.16.3 express: 4.18.2 express-swagger-generator: 1.1.17 + express-ws: 5.0.2_express@4.18.2 formidable: 2.0.1 jsonwebtoken: 8.5.1 mysql2: 2.3.3 nodemon: 2.0.20 open: 8.4.0 svg-captcha: 1.4.0 - ts-node: 10.9.1_1049f756a027b302b59330a6f33f12ef + ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 typescript: 4.8.4 winston: 3.8.2 @@ -156,6 +164,14 @@ packages: '@types/range-parser': 1.2.4 dev: true + /@types/express-ws/3.0.1: + resolution: {integrity: sha512-VguRXzcpPBF0IggIGpUoM65cZJDfMQxoc6dKoCz1yLzcwcXW7ft60yhq3ygKhyEhEIQFtLrWjyz4AJ1qjmzCFw==} + dependencies: + '@types/express': 4.17.14 + '@types/express-serve-static-core': 4.17.31 + '@types/ws': 8.5.3 + dev: true + /@types/express/4.17.14: resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} dependencies: @@ -200,6 +216,12 @@ packages: '@types/node': 18.11.9 dev: true + /@types/ws/8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + dependencies: + '@types/node': 18.11.9 + dev: true + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true @@ -736,7 +758,7 @@ packages: resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} hasBin: true dependencies: - tsx: 3.11.0 + tsx: 3.12.0 dev: true /esprima/4.0.1: @@ -776,6 +798,19 @@ packages: - supports-color dev: true + /express-ws/5.0.2_express@4.18.2: + resolution: {integrity: sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ==} + engines: {node: '>=4.5.0'} + peerDependencies: + express: ^4.0.0 || ^5.0.0-alpha.1 + dependencies: + express: 4.18.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /express/4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -1592,7 +1627,7 @@ packages: resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: true - /ts-node/10.9.1_1049f756a027b302b59330a6f33f12ef: + /ts-node/10.9.1_cbe7ovvae6zqfnmtgctpgpys54: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -1623,8 +1658,8 @@ packages: yn: 3.1.1 dev: true - /tsx/3.11.0: - resolution: {integrity: sha512-q+q4xxu41+AafVwvAGqtNJ1ekPFd33ZhTMXvgIpHMqv/W89efwDRE9IyjhEAZm5iTHsshKaf1BYWSk789BrNCA==} + /tsx/3.12.0: + resolution: {integrity: sha512-Z9drA8U1/jRJRWVTS2rOwdsCfkAShwfYBlE+6BVZsZChDsgYsEZZe44MGNNK6V6wQTTtu1kRNV57MsKRMJfdpg==} hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.0 @@ -1710,6 +1745,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /yallist/2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true diff --git a/src/app.ts b/src/app.ts index 8bb4442..d171493 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,5 @@ import * as express from "express"; +import * as expressWs from "express-ws"; import * as bodyParser from "body-parser"; class App { @@ -8,6 +9,8 @@ class App { this.config(); } private config(): void { + // 支持websocket + expressWs(this.app); // 支持json编码的主体 this.app.use(bodyParser.json()); // 支持编码的主体 diff --git a/src/router/api/mysql.ts b/src/router/http.ts similarity index 97% rename from src/router/api/mysql.ts rename to src/router/http.ts index 12e3d6b..e36dffa 100644 --- a/src/router/api/mysql.ts +++ b/src/router/http.ts @@ -1,14 +1,13 @@ -import * as dayjs from "dayjs"; import * as mysql from "mysql2"; -import secret from "../../config"; +import secret from "../config"; import * as jwt from "jsonwebtoken"; import { createHash } from "crypto"; -import Logger from "../../loaders/logger"; -import { Message } from "../../utils/enums"; +import Logger from "../loaders/logger"; +import { Message } from "../utils/enums"; import { Request, Response } from "express"; // import { createMathExpr } from "svg-captcha"; -import getFormatDate from "../../utils/date"; -import { connection } from "../../utils/initMysql"; +import getFormatDate from "../utils/date"; +import { connection } from "../utils/mysql"; // import { formidable } from "formidable"; // let path = require("path"); diff --git a/src/server.ts b/src/server.ts index 68acbb5..e4bf49f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,9 +1,10 @@ import app from "./app"; // import * as open from "open"; import config from "./config"; +import * as dayjs from "dayjs"; import { user } from "./models/mysql"; import Logger from "./loaders/logger"; -import { queryTable } from "./utils/initMysql"; +import { queryTable } from "./utils/mysql"; const expressSwagger = require("express-swagger-generator")(app); expressSwagger(config.options); @@ -18,7 +19,7 @@ import { searchVague, // upload, // captcha, -} from "./router/api/mysql"; +} from "./router/http"; app.post("/login", (req, res) => { login(req, res); @@ -52,6 +53,30 @@ app.post("/searchVague", (req, res) => { // captcha(req, res); // }); +app.ws("/socket", function (ws, req) { + ws.send( + `${dayjs(new Date()).format("YYYY年MM月DD日HH时mm分ss秒")}成功连接socket` + ); + + // 监听客户端是否关闭socket + ws.on("close", function (msg) { + console.log("客户端已关闭socket", msg); + ws.close(); + }); + + // 监听客户端发送的消息 + ws.on("message", function (msg) { + // 如果客户端发送close,服务端主动关闭该socket + if (msg === "close") ws.close(); + + ws.send( + `${dayjs(new Date()).format( + "YYYY年MM月DD日HH时mm分ss秒" + )}接收到客户端发送的信息,服务端返回信息:${msg}` + ); + }); +}); + app .listen(config.port, () => { Logger.info(` diff --git a/src/utils/initMysql.ts b/src/utils/mysql.ts similarity index 100% rename from src/utils/initMysql.ts rename to src/utils/mysql.ts