在 NodeJS 中分离模块以用于单个对象

Separating modules in NodeJS for use with a single object

我有一个 NodeJS + ExpressJS + Socket.IO 服务器,我正在尝试将不同的命名空间划分到不同的模块中。

本质上,我想在 server.js 中需要 socket.io 库,但可以像这样从我的模块中访问 io 变量:

server.js

var app = require('express')();
var jwt = require('jsonwebtoken');
var server = require('http').Server(app);
var fs = require('fs');
var io = require('socket.io')(server);
var bodyParser = require('body-parser');

var _log = require('./logging/loggly.js').Client();

// Global NS
var SK = {
    Namespaces:{}
};

var Migrations = require('./sockets/migrations');
var Backups = require('./sockets/backups');
var Cloudmanager = require('./sockets/cloudmanager');


SK.Namespaces[Migrations.NS] = Migrations;
SK.Namespaces[Backups.NS] = Backups;
SK.Namespaces[Cloudmanager.NS] = Cloudmanager;

....
....

migrations.js

var exports = module.exports = {};


///////////////////////////////////////////////
//
//  Migrations Namespace
//
///////////////////////////////////////////////
exports.NS = 'migrations';

exports.socket = io.of('/'+exports.NS); // PROBLEM IS 'io' IS UNDEFINED HERE

exports.socket.on('connection', function(socket){

});

我的所有 3 个 socket.io 命名空间中的代码基本相同,但我无权访问 server.js 中使用的 io 变量。有没有办法在这里访问?我只使用 require() 吗?实现此功能的最佳方法是什么?

谢谢

您可以从 migrations.js 导出接受 io 值作为参数的函数:

module.exports = function (io) {
  var socket = io.of('/'+exports.NS);
  socket.on('connection', function(socket){});
  return {
    NS: 'migrations',
    socket: socket,
  };
};

然后只需在 server.js:

中要求并调用此函数
var Migrations = require('./sockets/migrations')(io);