【问题标题】:Socket.io emitting and broadcasting events but wont "hear" events from the serverSocket.io 发出和广播事件,但不会“听到”来自服务器的事件
【发布时间】:2013-08-13 00:39:43
【问题描述】:

我是 Socket.io 和 Express 的新手。在将用户分配到会话时,我正在努力启动和运行基本的聊天场景。从我的研究中,我意识到有很多方法可以做到这一点,就像星星一样多。我也意识到确实没有一个“公认的标准”(如果我错了,请告诉我)。这是我想出的最简单的方式(使用 req.session.'name' = 'value')

这是我的服务器代码:

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , path = require('path')
  , http = require('http')
  , io = require('socket.io')
  , cookie = require("cookie")
  , connect = require("connect")
  , app = express();


// all environments
app.configure(function() {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());

  app.use(express.cookieParser());
  app.use(express.session({secret: 'secret'}));
    app.use(app.router);
});

var server = http.createServer(app);
server.listen(app.get('port'), function() {
    console.log('ready');
});

var io = io.listen(server);


app.get('/', routes.index);
app.get('/user', routes.user);  

io.sockets.on('connection', function (socket) {

    socket.emit('connected', { connect: 'CONNECTED TO THE SERVER' });

    socket.on('client connect', function (data) {
        console.log("HEARD THE CLIENT");
    });

    socket.on('addingNewUser', function (data) {
      console.log('BROADCASTING ADDUSER');
      console.log(data);
      socket.broadcast.emit('addUser', data);
    });
});

这是我的 index.jade 代码:

extends layout

block content
  script(src="/socket.io/socket.io.js")
  script(src="/javascripts/index.js")
  script.
    var socket = io.connect('http://localhost:3000');

    socket.on('connected', function (data) {
      socket.emit('client connect', { connect: 'CLIENT IS CONNECTED' });
    });

    socket.on('addUser', function (data) {
      console.log("ADDING NEW USER:");
      req.session.user = data;
      console.log(data);
      $("#usernames").append('<p>'+data+'</p>');
    });

    $(document).ready(function(){
        $('#submit').click( function (data) {
          console.log("SUBMITTING FORM!");
          var userName = $("#add_user").val();
          console.log("user name " + userName);
          socket.emit('addingNewUser', { user: userName });
          return false;
        });
    });    


  #users.large-3.columns
    h5 Online Users
    p#usernames

  #messages.large-6.columns
    form
      fieldset
        legend I am (the) Legend
        input(type='text', id='add_user', name='add_user', placeholder='Type your name.')
        input.button.small(type='submit', id="submit", value='Send')
    #show_messages
      ul#user_message
  .large-3.columns

由于 StackOverflow 格式,某些缩进可能会关闭,但在实际文件中它很好。

您可以很好地跟踪所有控制台日志。它在“广播用户”之后停止在 console.log 处。

由于某种原因,“addUser”的侦听器没有接收到任何东西。

有什么想法吗?


编辑: 正如 cmets 中所指出的,广播仅向其并非源自的套接字发出。所以这就是为什么它从来没有触发听众。

但是,现在我遇到了一个新问题。我以前遇到过的一个。

在“addUser”的侦听器中,它为“req.session.user”返回一个错误,指出“未捕获的 ReferenceError:req 未定义”。

我该如何克服这个问题?

【问题讨论】:

  • 您有两个客户端正在运行吗?来自the documentationBroadcasting means sending a message to everyone else except for the socket that starts it.
  • 好收获。我不知道。我打开了第二个客户,现在我遇到了一个以前遇到过的新问题。我会把它作为编辑发布。

标签: node.js express socket.io pug


【解决方案1】:

您正在混淆您的客户端和服务器逻辑。

此代码(来自您的模板):

socket.on('addUser', function (data) {
  console.log("ADDING NEW USER:");
  req.session.user = data;
  console.log(data);
  $("#usernames").append('<p>'+data+'</p>');
});

在没有可用 req 对象的客户端执行。

默认情况下,socket.io 和 express 会话不会一起使用 - 您需要为您的应用添加一些额外的逻辑。

有几个项目旨在使这更容易,例如:

【讨论】:

  • 明白了。当addingNewUser 被触发时将它移到我的服务器端,但它仍然说它没有定义:socket.on('addingNewUser', function (data) { console.log('BROADCASTING ADDUSER'); console.log(data); req.session.user = data; socket.broadcast.emit('addUser', data); }); 我该如何解决这个问题?我可以在套接字内传递“req”对象吗? (对不起,我无法在 cmets 中格式化块代码)
猜你喜欢
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2016-07-17
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多