Express.js 包含来自另一个文件的套接字事件?

fac*_*_za 3 javascript sockets node.js

我刚开始表达,发现我的 app.js 变得有点拥挤。有没有一种方法可以获取所有套接字事件,将它们放入文件夹中的另一个文件中并将其包含在

io.sockets.on("connection", function(socket){
  //Require socket event file here
});
Run Code Online (Sandbox Code Playgroud)

我尝试了一些类似的事情:

 require('./mysockets')(server);
Run Code Online (Sandbox Code Playgroud)

并在另一个文件中执行以下操作:

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

// declare module constructor that is passed the http server to bind to
module.exports = function(server) {
     io.listen(server);
     //My code here
 };
Run Code Online (Sandbox Code Playgroud)

在这种情况下我错过了什么吗?我已经包含了一个pastebin:http://pastebin.com/zvs8aMjN

这显示了当我执行上述操作时我在控制台中遇到的错误。

编辑:

添加了我的套接字事件以显示它是如何使用的。我已经确认所有这些代码在直接从我的 app.js 运行时都有效,但是 require 似乎破坏了它。

  console.log("Client connection, no username");

    // ===============================================
    // DISCONNECTION
    // ===============================================
    socket.on('disconnect', function(data) {
      // Allows us to track if a unknown user has disconnected or if a known user has dosconnected
      if(!socket.username) {
        console.log("Client disconnected before username");
      } else {
        console.log("Player " + socket.username + " disconnected");
        serverFunctions.lobbyCheck();
        // Removes only one user
        allUsers.splice(allUsers.indexOf(socket.username), 1);
      }

      // Calls update usernames function
      serverFunctions.updateUsernames();
    });

    // ===============================================
    // NEW PLAYER LOGIC
    // ===============================================

    // Player has connected
    // Checks if username is already been used
    socket.on("new user", function(data, callback){
      // If it exists return false, else add it to array of allUsers
      if (allUsers.indexOf(data) != -1) {
        callback(false);
      } else {
        callback(true);
        socket.username = data;
        allUsers.push(socket.username);
        // Tells all active users which users are active
        serverFunctions.updateUsernames();
        console.log("Player " + socket.username + " connected");

        serverFunctions.lobbyCheck();
        // Calls theplayer check in order to push through the player names client side
        serverFunctions.playerCheck();
      }
    });

    // ===============================================
    // Game Start Logic
    // ===============================================

    // ===============================================
    // CHAT LOGIC
    // ===============================================

    // Broadcasts a message
    socket.on("send message", function(data){
      io.sockets.emit("new message", {msg: data, user: socket.username});
    });
});
Run Code Online (Sandbox Code Playgroud)

这发生在我的套接字连接之上:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
Run Code Online (Sandbox Code Playgroud)

Zoh*_*jaz 5

在 app.js 中你得到io这样的对象

var io = require('socket.io')(server);
Run Code Online (Sandbox Code Playgroud)

现在您需要将此io对象传递给套接字模块,以便代码可以将侦听器添加到该对象。

在 app.js 中替换

require('./mysockets')(server);
Run Code Online (Sandbox Code Playgroud)

和

require('./mysockets')(io);
Run Code Online (Sandbox Code Playgroud)

因为你必须传递io对象,而不是server对象。

并在mysockets.js文件中

module.exports = function(io) {
    io.sockets.on("connection", function(socket){
          // Broadcasts a message
          socket.on("send message", function(data){
             io.sockets.emit("new message", {msg: data, user: socket.username});
          });

        // other listeners will go here.
    });
};
Run Code Online (Sandbox Code Playgroud)