如何通过Node.js将对象实时发送到浏览器

时间:2015-04-09 08:15:05

标签: javascript node.js asterisk

大家

我在Node.js和Asterisk AMI的项目中工作

Asterisk向Node.js服务器发送事件,Node.js将Obj中的事件发送到浏览器

我的问题是节点服务器在从AMI更新数据时不发送新对象

var AsteriskAmi = require('asterisk-ami');
var ami = new AsteriskAmi( { host: '127.0.0.1', username: 'admin', password: '123456' } );
var Send;

ami.on('ami_data', function(data){

    // this obj update when ami send event
    Send = data;
});

ami.connect(function(){
});

var http = require('http');

var app = http.createServer(function(req,res) {
    res.setHeader('Content-Type': 'text/plain');

    //my problem here , object was sent but not update when ami send other object
    res.end(Send);
});

app.listen(3000);

1 个答案:

答案 0 :(得分:2)

1。 res.end(发送)

这是你的第一个问题。当有人访问您的主机时,您正在收集帽子作为最后一条消息收集,并且您将其发送到浏览器。并关闭连接。要将实时事件传输到浏览器,您应该使用基于socket的机制,例如socket.io

要连接到此服务器,您必须使用html页面。

我的环境中的完整工作版本 - 使用asterisk-manager

public_html/test/index.html

<html>
    <body>
    <pre id="console">

    </pre>

        <script src="http://code.jquery.com/jquery.min.js"></script>
        <script src="https://cdn.socket.io/socket.io-1.2.1.js"></script>
        <script>
            var __url = 'http://localhost';
            var __port = 3001;

            __socketurl = __url + ':' + __port;

            socket = io.connect(__socketurl);
            socket.on('notification', function (data) {
                document.getElementById('console').innerHTML = JSON.stringify(data) + "\r\n";
            });
            socket.on('ami_event', function (data) {
                document.getElementById('console').innerHTML += JSON.stringify(data) + "\r\n";
            });

        </script>
    </body>
</html>

上面的代码尝试连接到localhost:3001的服务器并打印出来自节点应用程序的每个事件。

public_html/test/node/app.js

var app = require('http').createServer().listen(3001);
var io = require('socket.io').listen(app);

var AsteriskAmi = require('asterisk-manager');
var ami = new require('asterisk-manager')('25038','192.168.0.2','amilogin','amipassword', true);


io.sockets.on('connection', function(socket) {
    socket.emit('notification', {message: "connected"});
});

ami.on('managerevent', function(data) {
    console.log(data);
    io.sockets.emit('ami_event', data);
});

ami.connect(function(){
});

上面的代码在端口3001打开一个套接字,并保持它直到用户diconnects。请参阅手册如何创建IO服务器here。那里还有演示教程。脚本还连接到AMI本身并将每个事件从AMI传递到通过socket.io连接的每个套接字。

public_html/test/node/packages.json中的包:

{
    "name": "Server",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "socket.io": "latest",
        "asterisk-manager": "latest"
    }
}

app.js填写适当的数据,以登录AMI,npm install'ed,node app.js并使其正常运行。