gpt4 book ai didi

node.js - 构建 Node.js 和 Socket.io 应用程序的最佳实践?

转载 作者:行者123 更新时间:2023-12-05 01:11:30 25 4
gpt4 key购买 nike

目前我正在开发一个使用 websockets 进行通信的 Node 服务器。我习惯于在我的应用程序中应用 MVC(或 MC)模式。我想以类似的方式构建我的 socket.io,我的问题是如何以最佳方式做到这一点?

现在我有这样的东西:

utils/socket.ts:

type IO = null | SocketIO.Server;
let io: IO;

export function init(ioServer: IO) {
io = ioServer;
}

export function getIO(): IO {
return io;
}

应用.ts:

import express from 'express';
...

import { init } from './utils/socket';
import startSockets from './controllers';

const app = express();


...

const server = app.listen(process.env.PORT || 5000);

const io = socketio.listen(server);

if (io) {
init(io);
io.on('connect', startSockets);
}

Controller /index.ts:

import { onConnect } from './connect';
import { getIO } from '../utils/socket';

export default function (socket: SocketIO.Socket) {
const io = getIO();
socket.on('connect-player', onConnect);
}

controllers/connect.ts:

 import Player from '../models/Player';

export const onConnect = async function (this: SocketIO.Socket, name: string) {
const player = await Player.create({ name });

this.broadcast.emit('player-connected', `Player ${name} joined the game!`);
this.emit(
'player-connected',
`Congratulations ${name}, you successfully joined our game!`,
player,
);

this.on('disconnect', onDisconnect.bind(this, player.id));
};

const onDisconnect = async function (this: SocketIO.Socket, playerId: string) {
const player = await Player.findById(playerId);
await player?.remove();
this.broadcast.emit(
'player-connected',
`Player ${player?.name} left our game!`,
);
};

我不确定在我的 Controller 中使用“this”以及在 utils/socket.ts 中使用单例模式。这样合适吗?对我来说最重要的是保持应用清晰和可扩展。

我正在使用 express 和 typescript。Player.ts 是我的播放器 moongoose 模式。

最佳答案

一段时间以来,我一直在努力使用 socket.io + express.js,特别是我也习惯于应用 MVC 模式。
在搜索、谷歌搜索和堆栈溢出时,这些链接帮助我完成了项目。
https://blueanana.github.io/2017/03/18/Socket-io-Express-4/
https://github.com/onedesign/express-socketio-tutorial
https://gist.github.com/laterbreh/5d7bdf03258152c95b8d
Using socket.io in Express 4 and express-generator's /bin/www

我不会说什么是最好的方法,我什至不喜欢这种表达方式。但我会说这是一种方式,它有助于保持清晰、可扩展、有条理和很好的模块化。
特别是每个项目都有自己的内在要求和需求。
希望这些能对您有所帮助,就像对我一样,让您感受到并理解项目需要如何完成以及需要完成什么。

关于node.js - 构建 Node.js 和 Socket.io 应用程序的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63072252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com