我对诺德还是个新手.js和我发现,随着项目规模的增长,将项目分割成多个文件是相当复杂的.我之前有一个大文件,它既是文件服务器又是套接字.多人HTML5游戏的IO服务器.理想情况下,我想分离文件服务器socket.IO逻辑(从网络读取信息并将其写入带有时间戳的缓冲区,然后将其发送给所有其他玩家)和游戏逻辑.

使用socket中的第一个示例.为了演示我的问题,通常有两个文件.app.js是服务器,index.html被发送到客户端.

应用程序.js:

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

指数html:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

要分离文件服务器和游戏服务器逻辑,我需要一个文件中定义的函数"handler",我需要一个用于io回调的匿名函数.插座.on()将位于另一个文件中,我还需要第三个文件才能成功包含这两个文件.目前,我try 了以下方法:

开始js:

var fileserver = require('./fileserver.js').start()
  , gameserver = require('./gameserver.js').start(fileserver);

文件服务器.js:

var app = require('http').createServer(handler),
    fs = require('fs');

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

module.exports = {
    start: function() {
        app.listen(80);
        return app;
    }
}

游戏服务器:

var io = require('socket.io');

function handler(socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
        console.log(data);
    });
}

module.exports = {

    start: function(fileserver) {       
        io.listen(fileserver).on('connection', handler);
    }

}

这似乎是可行的(静态内容得到了正确的服务,当客户端连接时,控制台清楚地显示了与Socket.IO的握手),尽管从未发送数据.好像是插座.emit()和套接字.on()实际上从未被调用.我甚至在gameserver.js中修改了handler()以添加console.log('User connected');,但这永远不会显示.

我怎么能有插座.IO在一个文件中,文件服务器在另一个文件中,但仍然希望两者都能正常运行?

推荐答案

在插座里.io 0.8,您应该使用io.sockets.on('...')附加事件,除非您使用的是名称空间,否则您似乎缺少sockets部分:

io.listen(fileserver).sockets.on('connection', handler)

最好避免以这种方式链接它(您可能希望稍后使用io对象).我现在的做法是:

// sockets.js
var socketio = require('socket.io')

module.exports.listen = function(app){
    io = socketio.listen(app)

    users = io.of('/users')
    users.on('connection', function(socket){
        socket.on ...
    })

    return io
}

然后在创建服务器app之后:

// main.js
var io = require('./lib/sockets').listen(app)

Node.js相关问答推荐

如何在Node js中从MongoDB获取特定数据,使用GET方法?

Windows上使用ES6+的OpenAPI规范的Express服务器不接受嵌套路由'

如何将信号从终端窗口发送到运行在Raspberry Pi上的Puppeteer/Node.js上的webscraper

如何在Angular jest测试中调用Nodejs的垃圾收集? node v20的测试速度慢且内存泄漏

EJS ForEach循环标记

Promise 和 Azure 语音转文本

Typescript 正则表达式:过滤器返回空

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

每秒从套接字传来的数据有哪些存储方式?

如何从动态Typescript 文件加载模块

Express.js - 监听请求中止

在express js模型中将js转换为Typescript 时Typescript 错误

file.slim.js 中的苗条是什么

什么是nestjs错误处理方式(业务逻辑错误vs.http错误)?

bash:npm:找不到命令?

分块 WebSocket 传输

TypeError:winston.Logger 不是带有winston 和morgan 的构造函数

Node.js + Express:应用程序不会开始监听端口 80

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

当我try 向我的 S3 存储桶 (Node.js) 发送内容时,AWS 缺少凭证