简体   繁体   English

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

[英]How can I send object by Node.js to browser in Real Time

I am working on a project in Node.js and Asterisk AMI我正在使用 Node.js 和 Asterisk AMI 开发一个项目

Asterisk sends events to Node.js server and Node.js sends events in Obj to browser Asterisk 将事件发送到 Node.js 服务器,Node.js 将 Obj 中的事件发送到浏览器

My problem is the node server does not send a new object when updating data from AMI我的问题是节点服务器在从 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. res.end(Send) 1. res.end(发送)

This is your first issue.这是你的第一个问题。 When somebody is visiting your host, you are sending hat was collected as last message and you are sending it to browser.当有人访问您的主机时,您发送的帽子是作为最后一条消息收集的,并将其发送到浏览器。 And closing connection.并关闭连接。 For real time event transportation to browser you should use socket based mechanisms like socket.io .对于到浏览器的实时事件传输,您应该使用基于socket的机制,如socket.io

To connect to this server you will have to use an html page.要连接到此服务器,您必须使用 html 页面。

Full working version in my environment - using asterisk-manager我的环境中的完整工作版本 - 使用asterisk-manager

In public_html/test/index.html :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>

Above code tries to connect to server at localhost:3001 and prints out every event coming from node app.上面的代码尝试连接到localhost:3001服务器并打印出来自节点应用程序的每个事件。

In public_html/test/node/app.js :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(){
});

Above code opens a socket at port 3001 and keeps it until user diconnects.上面的代码在端口 3001 上打开一个套接字并保持它直到用户断开连接。 Please refer to manual how to create IO servers here .请参考手册如何在此处创建 IO 服务器。 Demo tutorias are available there also.那里也提供演示教程。 Script does also connect to AMI itself and passes every event from AMI to every socket connected via socket.io .脚本也连接到 AMI 本身,并将每个事件从 AMI 传递到通过socket.io连接的每个套接字。

Packages in public_html/test/node/packages.json : public_html/test/node/packages.json

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

Filled proper data in app.js to log into AMI, npm install 'ed, node app.js and got it working flawlessly.app.jsapp.js正确的数据以登录 AMI、 npm install 'ed、 node app.js并使其完美运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM