Amazon Alexa、alexa-app 和中间件
Amazon Alexa, alexa-app and middleware
这两天一直在走不同的路线,想不通。也许有人可以阐明我的问题。我正在尝试 运行 一个连接到多个平台并且已经有大约 5 个工作的机器人服务器。
我现在也在尝试整合Alexa。我看到 Alexa 请求进入我的服务器(因此 Alexa 技能和端点配置是正确的),但这也花了我很多时间,因为亚马逊显然只将流量发送到端口 443,因此允许在亚马逊开发中心定义另一个端口号,但什么都不做......很好!通过添加带有端口转发的负载均衡器解决。
进入真正的问题。我正在尝试使用以下示例中的 alexa-app 作为我的框架:
var express = require("express");
var alexa = require("alexa-app");
var express_app = express();
var app = new alexa.app("sample");
app.intent("number", {
"slots": { "number": "AMAZON.NUMBER" },
"utterances": ["say the number {-|number}"]
},
function(request, response) {
var number = request.slot("number");
response.say("You asked for the number " + number);
}
);
// setup the alexa app and attach it to express before anything else
app.express({ expressApp: express_app });
// now POST calls to /sample in express will be handled by the app.request() function
// GET calls will not be handled
// from here on, you can setup any other express routes or middleware as normal
我无法弄清楚的部分是当我在一个文件中设置我的快速服务器然后想使用中间件功能在第二个文件中设置我的侦听器时如何使用它......类似于:
app.js:
var express = require("express");
var express_app = express();
https.createServer({
key: fs.readFileSync(key),
cert: fs.readFileSync(cert),
ca: fs.readFileSync(ca)
}, app).listen(port, function () {
console.log("http: api server listening on port " + port);
});
app.use('/alexa', controller.Bot.Messenger.Listener.botMiddleWare());
listener.js:
var alexa = require("alexa-app");
var app = new alexa.app("sample");
bot.botMiddleWare = function botMiddleWare () {
return <return function to connect to express in app.js>;
}
感谢您的帮助或指点!
最后我设法通过 epxress 路由器将我的主要 app.js 连接到 alexa-app 的 getMessagingHandler 函数。因此,在 app.js 中将您的 alexa webhook 路由到监听器中的 getMessagingHandler,然后在监听器中:
var bot = new alexa.app('my_bot');
bot.getMessagingHandler = function getMessagingHandler() {
return function (req, res) {
req.on('end', function(){
var jsonData = JSON.parse(requestBody);
if(jsonData.request.type == "LaunchRequest") {
// handle response here
}
}
}
}
module.exports = bot;
主要app.js:
app.use('/alexa', controller.Bot.Alexa.Listener.getMessagingHandler());
这两天一直在走不同的路线,想不通。也许有人可以阐明我的问题。我正在尝试 运行 一个连接到多个平台并且已经有大约 5 个工作的机器人服务器。
我现在也在尝试整合Alexa。我看到 Alexa 请求进入我的服务器(因此 Alexa 技能和端点配置是正确的),但这也花了我很多时间,因为亚马逊显然只将流量发送到端口 443,因此允许在亚马逊开发中心定义另一个端口号,但什么都不做......很好!通过添加带有端口转发的负载均衡器解决。
进入真正的问题。我正在尝试使用以下示例中的 alexa-app 作为我的框架:
var express = require("express");
var alexa = require("alexa-app");
var express_app = express();
var app = new alexa.app("sample");
app.intent("number", {
"slots": { "number": "AMAZON.NUMBER" },
"utterances": ["say the number {-|number}"]
},
function(request, response) {
var number = request.slot("number");
response.say("You asked for the number " + number);
}
);
// setup the alexa app and attach it to express before anything else
app.express({ expressApp: express_app });
// now POST calls to /sample in express will be handled by the app.request() function
// GET calls will not be handled
// from here on, you can setup any other express routes or middleware as normal
我无法弄清楚的部分是当我在一个文件中设置我的快速服务器然后想使用中间件功能在第二个文件中设置我的侦听器时如何使用它......类似于:
app.js:
var express = require("express");
var express_app = express();
https.createServer({
key: fs.readFileSync(key),
cert: fs.readFileSync(cert),
ca: fs.readFileSync(ca)
}, app).listen(port, function () {
console.log("http: api server listening on port " + port);
});
app.use('/alexa', controller.Bot.Messenger.Listener.botMiddleWare());
listener.js:
var alexa = require("alexa-app");
var app = new alexa.app("sample");
bot.botMiddleWare = function botMiddleWare () {
return <return function to connect to express in app.js>;
}
感谢您的帮助或指点!
最后我设法通过 epxress 路由器将我的主要 app.js 连接到 alexa-app 的 getMessagingHandler 函数。因此,在 app.js 中将您的 alexa webhook 路由到监听器中的 getMessagingHandler,然后在监听器中:
var bot = new alexa.app('my_bot');
bot.getMessagingHandler = function getMessagingHandler() {
return function (req, res) {
req.on('end', function(){
var jsonData = JSON.parse(requestBody);
if(jsonData.request.type == "LaunchRequest") {
// handle response here
}
}
}
}
module.exports = bot;
主要app.js:
app.use('/alexa', controller.Bot.Alexa.Listener.getMessagingHandler());