我没有从 Amazon Lambda 获得适当的 JSON 响应
I am not getting appropriate JSON response from Amazon Lambda
嘿,Whosebug 的乐于助人的人们!我发现自己需要您的一些帮助和专业知识。我正在学习关于创建 Amazon Alexa 技能的教程,当我测试 lambda 函数的代码时,它成功了,但是,当我使用我指定给它的示例话语时,它是 "get current weather"(不要介意话语与实际端点无关,此时我使用 json 占位符的端点:https://jsonplaceholder.typicode.com/users 因为我只想要一个响应,任何类型的响应)。我非常感谢任何形式的帮助!在此先感谢大家!
这是我的代码:
var https = require("https");
exports.handler = (event, context) => {
try{
if (event.session.new){
// New Session
console.log("new session!");
}
switch (event.request.type){
case "LaunchRequest":
// > Launch Request
console.log("launch request!");
context.succeed(
generateResponse(
buildSpeechletResponse("Welcome!!!!!!!! Let's make this work!", true),
{}
)
)
break;
case "IntentRequest":
// > Intent Request
console.log("intent request!"); // endpoint added here below
switch(event.request.intent.name){
case "getWeatherIntent":
var endpoint = "https://jsonplaceholder.typicode.com/users"; // this works with this "placebo endpoint data" https://jsonplaceholder.typicode.com/posts ***** api.openweathermap.org/data/2.5/weather?zip=10005,us&APPID=08d6215ef934232110949692d5ffb8da
var body = ""
https.get(endpoint, (response) => {
response.on('data', (chunk) => {body += chunk})
response.on('end', () => {
var data = JSON.parse(body);
var weatherCount = data.userId; // might have something to do with this variable
context.succeed(
generateResponse(
buildSpeechletResponse("current is ${weatherCount}", true),
{}
)
)
})
})
}
break; // endpoint added here above
case "SessionEndedRequest":
// > Session Ended Request
console.log("session ended request!");
break;
default:
context.fail("invalid request type!: {event.request.type}");
}
} catch(error) {context.fail("Exception: ${error}")}
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
return{
outputSpeech:{
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
}
}
generateResponse = (speechletResponse, sessionAttributes) => {
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
}
}
这里还有意图模式:
{
"intents":[
{ "intent": "getWeatherIntent"
}
]
}
这是 lambda 请求:
{
"session": {
"sessionId": "SessionId.51e05faf-df95-420f-9cfc-3736b1839482",
"application": {
"applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
},
"new": true
},
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.4b18c102-47ea-4855-a5da-6407379c0384",
"locale": "en-US",
"timestamp": "2017-02-28T02:13:25Z",
"intent": {
"name": "getWeatherIntent",
"slots": {}
}
},
"version": "1.0"
}
这是 lambda 响应:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is ${weatherCount}"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
变量 ${weatherCount} 不应该已经 return 从 JSON 解析出来的东西而不是 return 按原样再次解析吗?
这是将模板文字周围的引号更改为反引号(将“${weatherCount}”更改为 ${weatherCount}
)后的新 Lambda 响应,所以我们可能会有所作为!:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
现在可以使用了!关键是将模板文字周围的引号更改为反引号。这是新的 lambda 请求和新的 lambda 响应。
Lamdba 请求:
{
"session": {
"sessionId": "SessionId.9f8cc454-110f-4610-a7fe-cd0918fd804f",
"application": {
"applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
},
"new": true
},
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.229831d9-3bd1-4173-a1c4-7664994a1a77",
"locale": "en-US",
"timestamp": "2017-02-28T02:39:30Z",
"intent": {
"name": "getWeatherIntent",
"slots": {}
}
},
"version": "1.0"
}
新的 Lambda 响应:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is 1"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
在我看来,这似乎是您 template literals 的问题。模板文字需要用反引号而不是单引号或双引号括起来。将所有使用模板文字的字符串的引号替换为反引号。
例如:
"current is ${weatherCount}"
变为:
`current is ${weatherCount}`
其他故障排除提示:
确保您使用的是 AWS Lambda 可用的最新版本的节点;在撰写本文时,即 v4.3.2。旧版本的节点不支持模板文字。
如果这些步骤中的任何一个都失败,只需将模板文字替换为变量即可将其排除为您的问题。
console.log 输出被写入 AWS Lambda 中的 cloudwatch——您可以使用它来调试 lambda 函数的每次调用。更多信息在这里:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-logging.html
嘿,Whosebug 的乐于助人的人们!我发现自己需要您的一些帮助和专业知识。我正在学习关于创建 Amazon Alexa 技能的教程,当我测试 lambda 函数的代码时,它成功了,但是,当我使用我指定给它的示例话语时,它是 "get current weather"(不要介意话语与实际端点无关,此时我使用 json 占位符的端点:https://jsonplaceholder.typicode.com/users 因为我只想要一个响应,任何类型的响应)。我非常感谢任何形式的帮助!在此先感谢大家!
这是我的代码:
var https = require("https");
exports.handler = (event, context) => {
try{
if (event.session.new){
// New Session
console.log("new session!");
}
switch (event.request.type){
case "LaunchRequest":
// > Launch Request
console.log("launch request!");
context.succeed(
generateResponse(
buildSpeechletResponse("Welcome!!!!!!!! Let's make this work!", true),
{}
)
)
break;
case "IntentRequest":
// > Intent Request
console.log("intent request!"); // endpoint added here below
switch(event.request.intent.name){
case "getWeatherIntent":
var endpoint = "https://jsonplaceholder.typicode.com/users"; // this works with this "placebo endpoint data" https://jsonplaceholder.typicode.com/posts ***** api.openweathermap.org/data/2.5/weather?zip=10005,us&APPID=08d6215ef934232110949692d5ffb8da
var body = ""
https.get(endpoint, (response) => {
response.on('data', (chunk) => {body += chunk})
response.on('end', () => {
var data = JSON.parse(body);
var weatherCount = data.userId; // might have something to do with this variable
context.succeed(
generateResponse(
buildSpeechletResponse("current is ${weatherCount}", true),
{}
)
)
})
})
}
break; // endpoint added here above
case "SessionEndedRequest":
// > Session Ended Request
console.log("session ended request!");
break;
default:
context.fail("invalid request type!: {event.request.type}");
}
} catch(error) {context.fail("Exception: ${error}")}
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
return{
outputSpeech:{
type: "PlainText",
text: outputText
},
shouldEndSession: shouldEndSession
}
}
generateResponse = (speechletResponse, sessionAttributes) => {
return {
version: "1.0",
sessionAttributes: sessionAttributes,
response: speechletResponse
}
}
这里还有意图模式:
{
"intents":[
{ "intent": "getWeatherIntent"
}
]
}
这是 lambda 请求:
{
"session": {
"sessionId": "SessionId.51e05faf-df95-420f-9cfc-3736b1839482",
"application": {
"applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
},
"new": true
},
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.4b18c102-47ea-4855-a5da-6407379c0384",
"locale": "en-US",
"timestamp": "2017-02-28T02:13:25Z",
"intent": {
"name": "getWeatherIntent",
"slots": {}
}
},
"version": "1.0"
}
这是 lambda 响应:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is ${weatherCount}"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
变量 ${weatherCount} 不应该已经 return 从 JSON 解析出来的东西而不是 return 按原样再次解析吗?
这是将模板文字周围的引号更改为反引号(将“${weatherCount}”更改为 ${weatherCount}
)后的新 Lambda 响应,所以我们可能会有所作为!:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
现在可以使用了!关键是将模板文字周围的引号更改为反引号。这是新的 lambda 请求和新的 lambda 响应。
Lamdba 请求:
{
"session": {
"sessionId": "SessionId.9f8cc454-110f-4610-a7fe-cd0918fd804f",
"application": {
"applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
},
"new": true
},
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.229831d9-3bd1-4173-a1c4-7664994a1a77",
"locale": "en-US",
"timestamp": "2017-02-28T02:39:30Z",
"intent": {
"name": "getWeatherIntent",
"slots": {}
}
},
"version": "1.0"
}
新的 Lambda 响应:
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "current is 1"
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
在我看来,这似乎是您 template literals 的问题。模板文字需要用反引号而不是单引号或双引号括起来。将所有使用模板文字的字符串的引号替换为反引号。
例如:
"current is ${weatherCount}"
变为:
`current is ${weatherCount}`
其他故障排除提示:
确保您使用的是 AWS Lambda 可用的最新版本的节点;在撰写本文时,即 v4.3.2。旧版本的节点不支持模板文字。
如果这些步骤中的任何一个都失败,只需将模板文字替换为变量即可将其排除为您的问题。
console.log 输出被写入 AWS Lambda 中的 cloudwatch——您可以使用它来调试 lambda 函数的每次调用。更多信息在这里:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-logging.html