【问题标题】:Parse form data through socket.io and retrieve data通过socket.io解析表单数据并取回数据
【发布时间】:2015-01-02 07:23:37
【问题描述】:

我正在尝试通过主机解析表单数据,该主机将以第二屏幕样式的 Web 应用程序发送给客户端,但是我正在努力获取表单数据,尤其是从主机和客户端获取的 nameTheBet。

我错过了什么?代码如下:

HTML 块

<script id="create-game-template" type="text/template">
    <div class="createGameWrapper">
        <div id="betSummary">
            <div class="info">
                <span class="nameTheBet"></span>
            </div>
        </div>

        <div class="info">Open this site on your mobile device:</div>

        <div id="gameURL" class="infoBig">Error!</div>
            <div class="info">Then click <strong>JOIN</strong> and <br/> enter the following Game ID:</div>
            <div id="spanNewGameCode" class="gameId">Error!</div>
        <div id="playersWaiting"></div>
    </div>
</script>

存储数据

onCreateClick: function () {

IO.socket.emit('hostCreateNewGame');

var data = {
    gameId : +($('#inputGameId').val()),
    placeBet : +($('#inputPlaceBet').val()),
    nameTheBet : $('#inputNameTheBet').val(),
    playerName : $('#inputPlayerName').val() || 'anon'
};
$('#betSummary')
    .append('<p/>')
    .text(data.nameTheBet);

IO.socket.emit('nameTheBet', data);

// Set the appropriate properties for the current player.
App.myRole = 'Host';
App.Host.myBet = data.nameTheBet;
},

检索

function nameTheBet(data) {

io.sockets.in(data.gameId).emit('nameTheBet', data);
}

【问题讨论】:

  • 您是否也在客户端监听名为“nameTheBet”的事件?你确定“nameTheBet”事件是从服务器正确发出的吗?
  • 我认为这是失败的地方。我缺少什么来确保客户端正在侦听事件以及如何从服务器端进行调试?

标签: jquery node.js express socket.io


【解决方案1】:

我从头开始重写我的函数,并在从客户端解析到服务器的每一步进行调试,然后再发送回客户端。从服务器发送回客户端是问题所在。

存储数据

onCreateClick: function () {

    var data = {
        nameTheBet : $('#inputNameTheBet').val() || 'anon',
        playerName : $('#inputPlayerName').val() || 'anon'
    };

    IO.socket.emit('hostCreateNewGame', data);

    App.myRole = 'Player';
    App.Player.myBet = data.nameTheBet;
},

服务器端

function hostCreateNewGame(data) {
    // Create a unique Socket.IO Room
    var thisGameId = ( Math.random() * 100000 ) | 0;
    var thisBet = data.nameTheBet

    this.emit('newGameCreated', {gameId: thisGameId, mySocketId: this.id, nameTheBet: thisBet});

    this.join(thisGameId.toString());
}

这有什么作用....

onNewGameCreated : function(data) {
    App.Host.gameInit(data);
    App[App.myRole].setTheBet(data);
    console.log(data.nameTheBet);
},

附加 HTML 块

setTheBet : function(data) {
    $('#betSummary')
        .append('<p/>')
        .text(data.nameTheBet);
},

【讨论】:

    【解决方案2】:

    我相信当你发出数据时,它需要被包装在一个 on connection 函数中,它看起来像:

    IO.on('connection', function(socket){
      //your code here
      socket.emit('nameTheBet', data);
    });
    

    *edit 在这两个地方你都在发射,但我没有看到你在用socket.on('nameTheBet')收听的任何地方

    【讨论】:

    • 很抱歉应该补充一下,发射已经嵌套在一个连接函数中。还有其他想法吗?
    • 啊,是的,所有的连接都在工作,因为我可以取回玩家的名字,而不是其他任何值。我认为它必须在存储功能中?
    • 就在您在存储函数中发出数据之前,当您使用 console.log(data) 时,它会产生您期望的结果吗?
    • 是的,Object {gameId: NaN, placeBet: NaN, nameTheBet: "GHGHGHG", playerName: "FDFDFDFD"}
    • 在这种情况下,您的错误不会出现在 io.sockets.in(data.gameId) 中,因为那不是数字吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多