【问题标题】:Trigger socket.emit from exported module从导出的模块触发 socket.emit
【发布时间】:2017-08-13 07:25:57
【问题描述】:

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

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

在我的 consumer.js 中,当我调用 socket.emit('message') 时,我收到一个错误消息: "无法读取属性 'emit' of null"

为什么我无法使用 emit?

这是我的代码: 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 中使用的发射没有。

【问题讨论】:

  • 你写的邮政编码
  • 代码添加到上面的文件中。

标签: node.js socket.io


【解决方案1】:

这行代码:

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

【讨论】:

  • 谢谢,我实现了这段代码,但是当我在 consumer.js 中调用:socket.emit('newMessage') 时,我收到一个错误,即无法读取 null 的属性 'emit'
  • @dwax - 如果我能看到您正在尝试的确切代码,我只能提供帮助(您可以使用“编辑”将其添加到您的问题中)。
  • @dwax - 看来您可能对iosocket 的值感到困惑。它们不一样。
  • 感谢您的帮助。我将我的代码上传到以下公共 git 存储库:github.com/daniwaxman/stackoverflow 我想要做的是,当用户点击 GET:/user 路由时,我们会向所有客户端发出一个套接字事件。
  • @dwax - 没有多少人会浏览存储库来尝试找出问题所在。为了提高获得帮助的机会并遵循此处的网站指南,您应该压缩导致问题的代码,准确解释问题所在并将其添加到您的问题中。
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多