【问题标题】:Pass variable value to client side and store it in global variable将变量值传递给客户端并将其存储在全局变量中
【发布时间】:2015-10-14 12:57:28
【问题描述】:

我还是 socket.io 的新手,我正在尝试将一个值传递给服务器端并将其存储在一个全局变量中,然后我可以使用它对 ARI 执行一些逻辑。

所以在我的服务器端我有:

io.sockets.on('muting', function (data) {
    mute = data;
    console.log("client side:" + mute);
});

为了清楚起见,整个服务器端代码:

var ari = require('ari-client');
var util = require('util');
var chanArr = [];
var test;
var mute;
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);

//ARI client
ari.connect('http://localhost:8088', 'asterisk', 'asterisk', clientLoaded);

function clientLoaded(err, client) {
    if (err) {
        throw err;
    }
    // find or create a holding bridges
    var bridge = null;
    client.bridges.list(function (err, bridges) {
        if (err) {
            throw err;
        }

        bridge = bridges.filter(function (candidate) {
                return candidate.bridge_type === 'mixing';
            })[0];

        if (bridge) {
            console.log(util.format('Using bridge %s', bridge.id));
        } else {
            client.bridges.create({
                type : 'mixing'
            }, function (err, newBridge) {
                if (err) {
                    throw err;
                }

                bridge = newBridge;
                console.log(util.format('Created bridge %s', bridge.id));
            });
        }
    });

    // handler for StasisStart event
    function stasisStart(event, channel) {
        console.log(util.format(
                'Channel %s just entered our application, adding it to bridge %s',
                channel.name,
                bridge.id));

        channel.answer(function (err) {
            if (err) {
                throw err;
            }

            bridge.addChannel({
                channel : channel.id
            }, function (err) {
                var id = chanArr.push(channel.name)
                    console.log("Value: " + test);
                test = channel.name;
                updateSip);

                if (err) {
                    throw err;
                }

                //If else statement to start music for first user entering channel, music will stop once more than 1 enters the channel.
                if (chanArr.length <= 1) {
                    bridge.startMoh(function (err) {
                        if (err) {
                            throw err;
                        }
                    });
                } else if (chanArr.length === 2) {
                    bridge.stopMoh(function (err) {
                        if (err) {
                            throw err;
                        }
                    });
                } else {}

            });

        });

    }

    // handler for StasisEnd event
    function stasisEnd(event, channel) {
        console.log(util.format(
                'Channel %s just left our application', channel.name));
        console.log(channel.name);

        var index = chanArr.indexOf(channel.name);
        chanArr.splice(index, 1);
        updateSip();
    }
    client.on('StasisStart', stasisStart);
    client.on('StasisEnd', stasisEnd);
    client.start('bridge-hold');
}

//Socket.io logic here
server.listen(3009, function () {
    console.log('listening on *:3009');
});

app.use(express.static(__dirname + '/public'));
app.get('/', function (req, res) {
    res.sendfile(__dirname + "/testPage.html");
});

io.sockets.on('connection', function (data) {
    updateSip();
});

io.sockets.on('muting', function (data) {
    mute = data;
    console.log("client side:" + mute);
});

function updateSip() {
    console.log("Value: " + test);
    io.sockets.emit('sip', chanArr);
}

在我的客户端:

    $(document).on('click', '#kick', function() {
        mute = !mute;
        socket.emit('muting', mute);
        console.log(mute)
});

完整的客户端代码:

jQuery(function ($) {
    var socket = io.connect();
    var mute = false;
    var $sip = $('#sip');

    socket.on('sip', function (data) {
        var sip = '';
        $(".exe").remove();
        for (i = 0; i < data.length; i++) {
            sip += data[i];
            if (sip) {
                $sip.append('<tr class="exe">\
                                                        <td>' + sip + '</td>\
                                                        <td><button class="btn btn-default mute" id="kick" type="submit">Mute</button></td>\
                                                        <td><button class="btn btn-default kick" id="kicks" data-toggle="modal" data-target="#myModal" type="submit">Kick</button></td>\
                                                        </tr>');
            } else {
                $sip.append('Currently no extensions');
            }
            sip = '';
        }

    });

    $('.kick').click(function () {
        $('#myInput').focus()
    });

    $(document).on('click', '#kick', function () {
        mute = !mute;
        socket.emit('muting', mute);
        console.log(mute)
    });

});

我错过了一些非常小的东西,但无法弄清楚。

编辑:我没有收到错误消息,似乎由于某种原因根本没有通过信息服务器端。

我正在使用快递。

亲切的问候。

【问题讨论】:

  • 您遇到错误了吗?
  • @VC1 无,一直在用console.log看看函数是否运行。似乎没有到达服务器端,否则它会到达 console.log 那里它没有。它只在客户端登录,这让我明白我没有通过 socket.io 正确传递它。不知道做错了什么。
  • 您应该从服务器端提供更多代码。
  • @Anonymous0day 提供了整个服务器端代码,问题现已更新。
  • io.sockets.on 之后在updateSip(); 之前尝试console.log,以确保您到达您的服务器

标签: javascript jquery node.js express socket.io


【解决方案1】:

来自套接字 io 文档:http://socket.io/docs/#using-with-the-express-framework

您可以尝试将'muting' 事件侦听器包装在'connection' 事件侦听器中。请注意,您将使用来自'connection' 事件的socket 参数来监听'muting'

服务器端:

io.sockets.on('connection',function (socket) {
  updateSip();
  socket.on('muting', function (data) {
     mute = data;
     console.log("client side:" + mute);
  });
});

【讨论】:

  • 这成功了,非常感谢!当我将来需要将任何数据传递给服务器时,这应该对我有所帮助。
  • 是的,因为 io.sockets 和 socket 不是同一个对象。 io.sockets 是所有的sockets,socket是具体的socket...
  • 这很有道理,我对 socket.io 还是很陌生,所以这应该是一个巨大的帮助。
【解决方案2】:
var socket = io.connect();

不,你没有到达你的服务器!

 //Socket.io logic here
 server.listen(3009, function () {
     console.log('listening on *:3009');
 });

您的套接字服务器似乎正在侦听端口 3009,因此您必须告诉您的客户端您的服务器在哪里(路径 -> 例如:http://myoffice.localhost)以及到达服务器的端口

尝试更新客户端:

 io.connect("wss://" + document.location.hostname + ':' + 3009);

【讨论】:

  • 什么?这是否意味着,我正在到达服务器端。否则我目前的功能都不会工作,我不明白这是怎么回事=/
  • 我不明白这是怎么回答的,我已经有了路径...注意我正在使用 express,但我尝试了您的建议,结果在各个方面都与以前完全相同所以我不确定那应该做什么:(我的网页在有或没有("wss://" + document.location.hostname + ':' + 3009);的情况下都可以正常工作,只是为了清楚起见,我的问题不是连接服务器端,我的问题是将值传递到服务器端并将其存储在全局变量。
  • var socket = io.connect(); 这是您 完整客户端代码的第二行: 并且没有路径
  • 也许用你的数据更新我的例子: http 而不是 wss ,你的服务器的路径而不是 document.location.hostname
  • 然而结果是完全一样的,我已经应用了你在客户端建议的改变,没有任何改变。当我应用它时,它仍然像以前一样工作。我确实相应地更新了它
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多