Node.js Lambda函数返回“响应无效”。从REST调用返回到Alexa Service Simulator [英] Node.js Lambda function returns "The response is invalid" back to Alexa Service Simulator from REST call
问题描述
在node.js Lambda函数和Alexa之间对API进行REST调用时遇到问题。我正在使用请求库来进行具有帐户关联技能的通话。我仅为目的设置了一个示例话语,模拟器看到了这个效果。
Having issues making a REST call to an API between a node.js Lambda function and Alexa. I'm using the request library to make the calls with an account linked skill. I've only set one sample utterance for the intent, and the simulator see this fine.
此外,cloudwatch日志还显示了来自api端点的200响应代码
Also, the cloudwatch logs show a 200 response code from the api endpoint and any of the returned data from the API from console.logs to CW.
'use strict';
var http = require('http');
var request = require('request');
var Alexa = require('alexa-sdk');
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX";
exports.handler = function(event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
var handlers = {
'LaunchRequest': function () {
this.emit(':tell', 'Hi!');
},
'ApiWelcomeIntent': function () {
request('https://some.web/api', function (error, response, body) {
if (!error && response.statusCode == 200) {
// from within the callback, write data to response, essentially returning it.
var speechOutput = JSON.stringify(body);
console.log(body + " :Raw output?");
console.log(speechOutput + ' :JSON stringified');
console.log(response.statusCode);
this.emit(':tell', speechOutput);
} else {
console.log(error + ' : ' + response.statusCode);
this.emit(':tell', 'There was an error');
}
});
},
'AMAZON.HelpIntent': function () {} //.........And other built in intents.
}
};
我想这与语音格式有关,我要求Alexa发出/告诉?
I'm guessing its something to do with the format of speechOutput that I'm asking Alexa to "emit/tell"?
推荐答案
不,它与SpeechOutput的格式无关。问题是,当执行 request
方法的回调时,对 this
的引用会丢失。要解决此问题,请在调用请求
之前保留对 this
的引用(例如,分配 this
到名为 self
)的变量:
No, it has nothing to do with the format of speechOutput. The issue is that when the callback of the request
method is executed, the reference to this
is lost. To solve that, keep a reference to this
before you call request
(e.g. assign this
to a variable called self
):
'use strict';
var http = require('http');
var request = require('request');
var Alexa = require('alexa-sdk');
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX";
exports.handler = function(event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
var handlers = {
'LaunchRequest': function () {
this.emit(':tell', 'Hi!');
},
'ApiWelcomeIntent': function () {
self = this
request('https://some.web/api', function (error, response, body) {
if (!error && response.statusCode == 200) {
// from within the callback, write data to response, essentially returning it.
var speechOutput = JSON.stringify(body);
console.log(body + " :Raw output?");
console.log(speechOutput + ' :JSON stringified');
console.log(response.statusCode);
self.emit(':tell', speechOutput); // USE SELF HERE
} else {
console.log(error + ' : ' + response.statusCode);
self.emit(':tell', 'There was an error'); // AND HERE AS WELL
}
});
},
'AMAZON.HelpIntent': function () {} //.........And other built in intents.
}
};
这篇关于Node.js Lambda函数返回“响应无效”。从REST调用返回到Alexa Service Simulator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!