5

所以,我开始使用 Asterisk Restful Interface (ARI)。

我创建了一个单独的快速应用程序来执行此操作。

我有一个正确配置的 Asterisk 13 实例正在运行。我知道这一点是因为当我进入https://192.168.46.122:8088/ari/sounds浏览器时,系统会提示我输入用户名和密码,输入时会返回一个有效的 JSON 对象以及预期的数据......

[
  {
    "id": "conf-now-unmuted",
    "text": "The conference is now unmuted.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "vm-nomore",
    "text": "No more messages.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "vm-review",
    "text": "press 1 to accept this recording press 2 to listen to it press 3 to rerecord your message",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "demo-echodone",
    "text": "The echo test has been completed.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  },
  {
    "id": "confbridge-rest-talk-vol-out",
    "text": "...to reset your speaking volume to the default level.",
    "formats": [
      {
        "language": "en",
        "format": "gsm"
      }
    ]
  }, ...... etc etc

在我的app.js文件中,我包含了以下代码...

...
var logger = require('morgan');
var client = require('ari-client');
var url = 'https://192.168.46.122:8088/ari/sounds';
var username = 'correct_username';
var password = 'correct_password';

client.connect(url, username, password, function (err, ari) {
  console.log('HELLLLLLOOOOO!!');
});
...

问题是匿名回调永远不会被触发。我从来没有看到'HELLLLLLOOOOO!!'

谁能解释为什么/在什么情况下会发生这种情况?模块是否有任何已知的错误可能导致此问题?

如果您需要有关配置、环境等的更多信息,请告诉我。

多谢你们

更新

以下评论......我尝试了以下内容:

client.connect(url, username, password)
.then(function(ari) {
  console.log('HELLLLLLOOOOO!!');
})
.catch(function(err){
  console.log('ERR: ' + err);
});

client.connect(url, username, password, function (err, ari) {
  if(err) console.log(err);

  console.log('HELLLLLLOOOOO!!');
});

没有错误,也没有'HELLLLLOOOOOOO!!' 在任何时候:-(

更新 2

刚刚访问/ari/api-docs/resources.json并得到以下回复......所以它看起来像是存在的。

{
  "_copyright": "Copyright (C) 2012 - 2013, Digium, Inc.",
  "_author": "David M. Lee, II <dlee@digium.com>",
  "_svn_revision": "$Revision: 430337 $",
  "apiVersion": "1.7.0",
  "swaggerVersion": "1.1",
  "basePath": "http://192.168.46.122:8088/ari",
  "apis": [
    {
      "path": "/api-docs/asterisk.{format}",
      "description": "Asterisk resources"
    },
    {
      "path": "/api-docs/endpoints.{format}",
      "description": "Endpoint resources"
    },
    {
      "path": "/api-docs/channels.{format}",
      "description": "Channel resources"
    },
    {
      "path": "/api-docs/bridges.{format}",
      "description": "Bridge resources"
    },
    {
      "path": "/api-docs/recordings.{format}",
      "description": "Recording resources"
    },
    {
      "path": "/api-docs/sounds.{format}",
      "description": "Sound resources"
    },
    {
      "path": "/api-docs/playbacks.{format}",
      "description": "Playback control resources"
    },
    {
      "path": "/api-docs/deviceStates.{format}",
      "description": "Device state resources"
    },
    {
      "path": "/api-docs/mailboxes.{format}",
      "description": "Mailboxes resources"
    },
    {
      "path": "/api-docs/events.{format}",
      "description": "WebSocket resource"
    },
    {
      "path": "/api-docs/applications.{format}",
      "description": "Stasis application resources"
    }
  ]
}

我现在认为这可能是 SSL 问题?!

4

1 回答 1

2

您的连接失败(原因如下所述),并且由于 中的问题/即将推出的功能node-ari-client,失败的连接不会被记录。

node-ari-client模块使用Swagger,它期望加载描述 API 的 JSON 模式。在node-ari-client实现中,Swagger 期望在%s//%s/ari/api-docs/resources.json.

因此,首先要检查的是它是否存在/在您的应用程序中是否可访问:

https://192.168.46.122:8088/ari/api-docs/resources.json

可能有多种原因导致此功能不可用,但问题很可能是身份验证。您提到在访问您的 URL 时会“提示您输入用户名和密码”。如果您的 JSON 模式(或任何其他需要在没有凭据的情况下访问的文件)在身份验证之后,您将需要重新考虑您的应用程序结构。

目前,如果在Swagger 加载 JSON 模式之前出现连接失败,node-ari-client则会静默失败。有一个Pull Request等待解决此问题并记录错误,但同时您应该解决阻止连接的潜在问题。

如果可以成功访问resources.json,则可能是访问资源存在其他问题。您描述的 URL 正在通过 访问您的服务https,但您的resources.json文件告诉 Swagger 通过常规 http 访问它。要处理此问题,您可以尝试:

将 Swagger 架构中的更改basePath为使用https

"basePath": "https://192.168.46.122:8088/ari",

protocols字段添加到 Swagger 架构:
"protocols":["http", "https"]

删除 https
这可能是一个很好的选择,以便发现是否https是连接问题的原因。只需保持 Swagger 模式不变,然后尝试访问/连接到您的服务http。这有什么不同吗?

于 2016-04-19T09:23:29.500 回答