javascript - 使用 nodeJS 在用户 Web 浏览器上打开一个 url
问题描述
我正在使用 nodeJS 上的星号管理器模块构建一个简单的 VoIP 应用程序。asterisk 服务器安装在 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应用程序,可以在用户本地浏览器上打开一个窗口?谢谢。
解决方案
出于安全原因,没有浏览器或操作系统可以让您在没有先连接的情况下在其他计算机上弹出浏览器窗口。
为此,我认为您必须构建一个客户端应用程序,例如将在个人计算机上运行的小部件、服务或浏览器扩展......这个客户端可以使用 Socket.io 来监听节点上发生的事件并做出反应。 js 结束。
这可能是一种解决方案。
推荐阅读
- python - 用python提高手绘草图质量
- amazon-web-services - 有没有办法用 s3cmd 备份所有存储桶
- git - 以前的回购所有者从未推送到远程。当我接管仓库时,如何保留该用户制作的 git 提交历史记录?
- python - 需要帮助我的列表理解 python 代码
- linux - 如果管道的左侧失败,则使从 subprocess.Popen 启动的 shell 管道失败
- angular - Angular http“referer”标头不尊重当前激活的路由
- r - 在 R 中构建模型的堆叠算法
- python - Catia 从装配体中的特定实例中选择特征
- coq - 如何考虑列表中的两个输出
- drop-down-menu - Angular12 - 引导下拉列表中的问题