0

私はSocket.ioとExpressが初めてです。私は、ユーザーをセッションに割り当てながら、基本的なチャット シナリオを実行する作業を行っています。私の調査から、これを行う方法は星の数ほどあることに気付きました。また、「受け入れられた標準」が実際には1つもないことにも気付きました(間違っている場合は、見せてください)。これは私が見つけた最も簡単な方法でした ( 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」のリスナーでは、「Uncaught ReferenceError: req is not defined」という「req.session.user」のエラーが返されます。

どうすればこれを克服できますか?

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 に答える