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



目前我正在开发一个使用websocket进行通信的节点服务器。我习惯于在我的应用程序中应用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;
}

应用程序:

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);
}

controllers/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);
}

控制器/连接.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!`,
);
};

我不确定在我的控制器中使用"this",也不确定在utils/socket.ts中使用那个singleton模式。这合适吗?对我来说,最重要的是保持应用程序的清晰性和可扩展性。

我用的是快递和打字。Player.ts是我对Player的如鱼得水的模式。

我之前一直在与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
在Express 4和Express generator';中使用socket.io;s/bin/www

我不会说什么是最好的方式,我甚至不喜欢这个表达。但我要说的是,这是一种方式,有助于保持它的清晰性、可扩展性、组织性和非常好的模块化
特别是每个项目都有自己的内在要求和需求
希望这些能帮助你,就像它为我做的那样,让我感受和理解如何以及需要在项目中做什么。

最新更新