首页 > 解决方案 > 使用 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应用程序,可以在用户本地浏览器上打开一个窗口?谢谢。

标签: javascriptnode.jsvoip

解决方案


出于安全原因,没有浏览器或操作系统可以让您在没有先连接的情况下在其他计算机上弹出浏览器窗口。

为此,我认为您必须构建一个客户端应用程序,例如将在个人计算机上运行的小部件、服务或浏览器扩展......这个客户端可以使用 Socket.io 来监听节点上发生的事件并做出反应。 js 结束。

这可能是一种解决方案。


推荐阅读