节点 ARI 客户端 |连接方法不触发回调?
Node ARI Client | Connect method not firing callback?
所以,我开始使用 Asterisk Restful 界面 (ARI)。
我已经创建了一个单独的快捷应用程序来执行此操作。
我有一个正确配置的 Asterisk 13 实例 运行。我知道这一点是因为当我在浏览器中转到 https://192.168.46.122:8088/ari/sounds
时,系统会提示我输入用户名和密码,在输入时,returns 一个有效的 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!!'
任何人都可以阐明 why/under 在什么情况下会发生这种情况?是否有任何已知的模块错误可能导致此问题?
如果您需要有关配置、环境等的更多信息,请告诉我
谢谢大家
更新
以下评论...我尝试了以下方法:
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!!');
});
没有错误,任何时候都没有 'HELLLLLOOOOOO!!' :-(
更新 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 问题?!
您的连接失败(原因如下所述),并且由于 node-ari-client
中的问题/即将推出的功能,未记录失败的连接。
node-ari-client
模块使用 Swagger,它期望加载描述 API 的 JSON 模式。在 node-ari-client
实现中,Swagger 期望在 %s//%s/ari/api-docs/resources.json
处找到此 JSON 架构。
因此,首先要检查的是您的应用程序中是否存在/可访问:
https://192.168.46.122:8088/ari/api-docs/resources.json
这可能不可用有多种原因,但最有可能的问题是身份验证。您提到在访问您的 URL 时“提示输入用户名和密码”。如果您的 JSON 架构(或任何其他需要在没有凭据的情况下访问的文件)落后于身份验证,您将需要重新考虑您的应用程序结构。
目前,如果 在 Swagger 加载 JSON 模式之前出现连接失败,node-ari-client
将静默失败。有一个 Pull Request waiting 可以解决这个问题并记录错误,但与此同时你应该解决阻止连接的潜在问题。
如果您可以成功访问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
访问/连接到您的服务。这有什么不同吗?
所以,我开始使用 Asterisk Restful 界面 (ARI)。
我已经创建了一个单独的快捷应用程序来执行此操作。
我有一个正确配置的 Asterisk 13 实例 运行。我知道这一点是因为当我在浏览器中转到 https://192.168.46.122:8088/ari/sounds
时,系统会提示我输入用户名和密码,在输入时,returns 一个有效的 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!!'
任何人都可以阐明 why/under 在什么情况下会发生这种情况?是否有任何已知的模块错误可能导致此问题?
如果您需要有关配置、环境等的更多信息,请告诉我
谢谢大家
更新
以下评论...我尝试了以下方法:
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!!');
});
没有错误,任何时候都没有 'HELLLLLOOOOOO!!' :-(
更新 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 问题?!
您的连接失败(原因如下所述),并且由于 node-ari-client
中的问题/即将推出的功能,未记录失败的连接。
node-ari-client
模块使用 Swagger,它期望加载描述 API 的 JSON 模式。在 node-ari-client
实现中,Swagger 期望在 %s//%s/ari/api-docs/resources.json
处找到此 JSON 架构。
因此,首先要检查的是您的应用程序中是否存在/可访问:
https://192.168.46.122:8088/ari/api-docs/resources.json
这可能不可用有多种原因,但最有可能的问题是身份验证。您提到在访问您的 URL 时“提示输入用户名和密码”。如果您的 JSON 架构(或任何其他需要在没有凭据的情况下访问的文件)落后于身份验证,您将需要重新考虑您的应用程序结构。
目前,如果 在 Swagger 加载 JSON 模式之前出现连接失败,node-ari-client
将静默失败。有一个 Pull Request waiting 可以解决这个问题并记录错误,但与此同时你应该解决阻止连接的潜在问题。
如果您可以成功访问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
访问/连接到您的服务。这有什么不同吗?