从导出的模块

时间:2017-03-21 14:44:03

标签: node.js socket.io

我正在尝试按照Patrick Roberts在此页面上提供的说明进行操作:

How can i export socket.io into other modules in nodejs?

当我调用socket.emit('message')时,在我的consumer.js中

我收到一个错误: “无法读取属性'emit'的null”

为什么发射不可用?

这是我的代码: io.js文件(在中间件目录中)

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

exports.io = function() {
  return io;
};

exports.initialize = function(server) {
  io = socketIO(server);

  io.on('connection', (socket) => {
    console.log('user connected')

    socket.emit('newMessage');

    socket.on('hello', (msg) => {
      console.log('message: ' + msg);
    });

    socket.on('disconnect', () => {
      console.log('user disconnected');
    });

  });
};

在app.js中我需要io文件:

var io = require('./middleware/io').initialize(server);

在我的consumer.js中,我有以下内容:

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

然后在我调用的函数中:

socket.emit('message') 

来自io.js文件的发出正在工作 - 我试图在不能使用的consumer.js中使用它。

1 个答案:

答案 0 :(得分:2)

这行代码:

var io = require('./middleware/io').initialize(server);

加载您的模块,调用模块上的.initialize(server)方法,然后将.initialize(server)的返回值分配给您的io变量。但是,您的.initialize()方法确实会返回任何内容,因此,io变量将为undefined

您可以修复我向.initialize()方法添加返回值:

exports.initialize = function(server) {
  io = socketIO(server);

  io.on('connection', (socket) => {
    console.log('user connected')

    socket.emit('newMessage');

    socket.on('hello', (msg) => {
      console.log('message: ' + msg);
    });

    socket.on('disconnect', () => {
      console.log('user disconnected');
    });

  });
  // return the socket.io instance so caller can use it
  return io;
};

或者,你可以改变这个:

var io = require('./middleware/io').initialize(server);

到此:

var ioModule = require('./middleware/io');
ioModule.initialize(server);
var io = ioModule.io();