我正在使用nodeJS上的星号管理器模块构建一个简单的VoIP应用程序。星号服务器安装在centos 7(基本安装)上,并托管在虚拟机上。下面的代码侦听代理登录事件,并在收到dtmf密钥时弹出一个URL:
var port = 5038,
host = 'asteriskIP',
username = 'popup',
password = 'popup',
open = require('open'),
mysql = require('mysql'),
ami = new require('asterisk-manager')(port, host, username, password, true);
ami.keepConnected();
//Mysql server connection pool
var pool = mysql.createPool({
host: host,
user: 'user',
password: 'password',
database: 'db'
});
ami.on('newstate', function (stateEvent) {
var channelState = stateEvent.channelstate;
if (channelState === '6') {
return false;
}
/*
Listen for new channel after agent login
*/
ami.on('newchannel', function (e) {
/* Check if caller id number is empty (This is necessary owning to new channel created as a result of
DTMF. If this returns true, return false else execute mysql query.
*/
if (e.calleridnum === '' && isNaN(e.calleridnum)) {
return false;
} else if (e.calleridnum !== '' && !isNaN(e.calleridnum)) {
var callerId = e.calleridnum;
sql = "INSERT INTO dtmf (caller_id) VALUES ?",
values = [[callerId]];
pool.query(sql, [values], function (error) {
if (error) throw error;
});
/*
Listen for DTMF on 'end' and update current caller table
*/
ami.on('dtmf', function (evt) {
var end = evt.end;
if (end === 'Yes') {
var digit = evt.digit;
sql = `UPDATE dtmf SET caller_lang = ${digit} WHERE caller_id = ?`,
values = [[callerId]];
pool.query(sql, [values], function (error) {
if (error) throw error;
});
/*
This piece of code retrieves DTMF code input and popsup
a url in the agents browser window.
*/
ami.on('bridge', function (evt) {
var state = evt.bridgestate;
if (state === 'Link') {
switch (digit) {
case '1':
open('http://someurl?' + digit);
break;
case '2':
open('http://someurl?' + digit);
break;
default:
}
}
})
}
});
}
return false;
});
});
当我在Mac上运行此代码时,一切正常。但是,当我将代码部署到虚拟机时,它可以正常插入和更新数据库,但是在我的浏览器中没有弹出URL。请问有一种在虚拟机上部署nodeJS应用的方法,可以在用户本地浏览器上打开一个窗口吗?谢谢。
答案 0 :(得分:0)
出于安全原因,没有浏览器或操作系统可以让您在未事先连接的情况下在其他计算机上弹出浏览器窗口。
为此,我认为您将必须构建一个客户端应用程序,例如将在个人计算机上运行的小部件,服务或浏览器扩展...该客户端可以使用Socket.io侦听并响应发生的事件Node.js结束。
那可能是一个解决方案。