0

我是 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 格式,一些缩进可能会关闭,但在实际文件中它很好。

您可以很好地跟踪所有控制台日志。它在“BROADCASTING USER”之后停在 console.log 处。

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

有任何想法吗?


编辑:正如评论中所指出的,广播只发射到它不是来自的套接字。所以这就是为什么它从来没有触发听众。

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

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

我该如何克服呢?

4

1 回答 1

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 会话不会一起使用 - 您需要向您的应用程序添加一些额外的逻辑。

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

于 2013-08-11T17:41:42.277 回答