首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速生成器,Socket.io事件多次发出

快速生成器,Socket.io事件多次发出
EN

Stack Overflow用户
提问于 2017-10-28 09:48:43
回答 1查看 318关注 0票数 0

我已经使用快速生成器创建了一个节点应用程序。我已经在应用程序中集成了socket.io。由于快递生成器有自己的创建快速服务器的方式,我遵循本程序成功地将套接字连接与侦听服务器集成,并通过res.io实例使整个应用程序中的io可用。

文件:bin/www

代码语言:javascript
复制
#!/usr/bin/env node
var app = require('../app').app;
var debug = require('debug')('www:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = require('../app').server;

/app.js

代码语言:javascript
复制
//Express handler
var app = express();
// Socket configuration
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.use(function(req, res, next){
  res.io = io;
  next();
});

...

module.exports = {app: app, server: server};

但问题是当我发出一个事件时,如下所示。我的客户正在多次读取数据。

routes/index.js

代码语言:javascript
复制
   var clients = 0;
   var nsp = res.io.of('/default-namespace');
    nsp.on('connection', function (socket) {
      clients++;
      console.log(clients + ' clients connected!');
      socket.on('disconnect', (reason) => {
        clients--;
        console.log(clients + ' clients connected!');
      });
         nsp.emit("socketToMe", "New User connected. Current clients:"+ clients);
    });

我的侦听器有以下代码:home.pug

代码语言:javascript
复制
 var socket = io('/default-namespace');
 socket.on('socketToMe', function (data) {
    $('#data-div').append($('<li>').text(data));
    });

每当我在另一个实例中刷新浏览器时,比如incoginito,主浏览器就会显示数据的多个事件。像这样

代码语言:javascript
复制
New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:2
New User connected. Current clients:1
New User connected. Current clients:1 

不知道是怎么回事。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-28 10:32:11

Nodejs是事件driven.The res对象不是全局变量。Express中间件为每个请求运行。

代码语言:javascript
复制
   var clients = 0;
   var nsp = res.io.of('/default-namespace');
   nsp.on('connection', function (socket) {
     clients++;
     console.log(clients + ' clients connected!');
     socket.on('disconnect', (reason) => {
     clients--;
     console.log(clients + ' clients connected!');
     });
     nsp.emit("socketToMe", "New User connected. Current 
     clients:"+clients);
   });

让我解释一下上面发生了什么,一个用户请求和req处理程序被触发,您访问res对象,然后侦听事件。因此,对于每个请求,您都在侦听套接字'connection' event.That,这意味着您设置多事件侦听器的时间与请求设置新侦听器的name.Every时间相同。

您应该只设置一个单个‘连接’侦听器。

这解释了多次发出相同事件的原因。

代码语言:javascript
复制
app.use(function(req, res, next){
 res.io = io;
 next();
});

不要使用上面的中间件函数,而是直接侦听io实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46988368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档