Alexa技能S3在参数中缺少必需的密钥Bucket



我正试图根据蛋糕时间教程制作一项技能,但每当我试图调用我的技能时,我都会遇到一个错误,我不知道为什么。

这是我的调用函数。

const LaunchRequestHandler = {
canHandle(handlerInput) {
console.log(`Can Handle Launch Request ${(Alexa.getRequestType(handlerInput.requestEnvelope) === "LaunchRequest")}`);
return (
Alexa.getRequestType(handlerInput.requestEnvelope) === "LaunchRequest"
);
},
handle(handlerInput) {
const speakOutput =
"Bem vindo, que série vai assistir hoje?";
console.log("handling launch request");
console.log(speakOutput);
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
},
};

它应该只提示一条葡萄牙语"的消息;贝姆文多,你能帮我吗"但由于某种原因,它试图访问amazonS3存储桶,并在控制台上打印此错误。

~~~~ Error handled: AskSdk.S3PersistenceAdapter Error: Could not read item (amzn1.ask.account.NUMBEROFACCOUNT) from bucket (undefined): Missing required key 'Bucket' in params
at Object.createAskSdkError (pathMarcaEpisodiolambdanode_modulesask-sdk-s3-persistence-adapterdistutilsAskSdkUtils.js:22:17)
at S3PersistenceAdapter.<anonymous> (pathMarcaEpisodiolambdanode_modulesask-sdk-s3-persistence-adapterdistattributespersistenceS3PersistenceAdapter.js:90:45)
at step (pathMarcaEpisodiolambdanode_modulesask-sdk-s3-persistence-adapterdistattributespersistenceS3PersistenceAdapter.js:44:23)
at Object.throw (pathMarcaEpisodiolambdanode_modulesask-sdk-s3-persistence-adapterdistattributespersistenceS3PersistenceAdapter.js:25:53)
at rejected (pathMarcaEpisodiolambdanode_modulesask-sdk-s3-persistence-adapterdistattributespersistenceS3PersistenceAdapter.js:17:65)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
Skill response
{
"type": "SkillResponseSuccessMessage",
"originalRequestId": "wsds-transport-requestId.v1.IDREQUESTED",
"version": "1.0",
"responsePayload": "{"version":"1.0","response":{"outputSpeech":{"type":"SSML","ssml":"<speak>Desculpe, não consegui fazer o que pediu.</speak>"},"reprompt":{"outputSpeech":{"type":"SSML","ssml":"<speak>Desculpe, não consegui fazer o que pediu.</speak>"}},"shouldEndSession":false},"userAgent":"ask-node/2.10.2 Node/v14.16.0","sessionAttributes":{}}"
}
----------------------

我已经从堆栈错误中删除了一些ID信息,但我认为它们与目的无关。

我唯一能想到的是当我在alexaskillbuilder中添加S3适配器时进行调用。

exports.handler = Alexa.SkillBuilders.custom()
.withApiClient(new Alexa.DefaultApiClient())
.withPersistenceAdapter(
new persistenceAdapter.S3PersistenceAdapter({
bucketName: process.env.S3_PERSISTENCE_BUCKET,
})
)
.addRequestHandlers(
LaunchRequestHandler,
MarcaEpisodioIntentHandler,
HelpIntentHandler,
CancelAndStopIntentHandler,
SessionEndedRequestHandler,
IntentReflectorHandler // make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers
)
.addRequestInterceptors(MarcaEpisodioInterceptor)
.addErrorHandlers(ErrorHandler)
.lambda();

这些是我所创造的意愿意图

这就是应该处理它们的函数。

const Alexa = require("ask-sdk-core");
const persistenceAdapter = require("ask-sdk-s3-persistence-adapter");
const intentName = "MarcaEpisodioIntent";
const MarcaEpisodioIntentHandler = {
canHandle(handlerInput) {
console.log("Trying to handle wiht marca episodio intent");
return (
Alexa.getRequestType(handlerInput.requestEnvelope) !== "LaunchRequest" &&
Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" &&
Alexa.getIntentName(handlerInput.requestEnvelope) === intentName
);
},
async chandle(handlerInput) {
const serie = handlerInput.requestEnvelope.request.intent.slots.serie.value;
const episodio =
handlerInput.requestEnvelope.request.intent.slots.episodio.value;
const temporada =
handlerInput.requestEnvelope.request.intent.slots.temporada.value;
const attributesManager = handlerInput.attributesManager;
const serieMark = {
serie: serie,
episodio: episodio,
temporada: temporada,
};
attributesManager.setPersistentAttributes(serieMark);
await attributesManager.savePersistentAttributes();
const speakOutput = `${serie} marcada no episódio ${episodio} da temporada ${temporada}`;
return handlerInput.responseBuilder.speak(speakOutput).getResponse();
},
};
module.exports = MarcaEpisodioIntentHandler;

任何帮助都将不胜感激。

由于某种原因,它试图访问amazon S3存储桶

首先,在轮询意向处理程序的canHandle函数之前,在每次使用中加载并配置持久性适配器。然后,在轮询任何持久性适配器之前,在RequestInterceptor中使用

如果那里有问题,它会在你到达LaunchRequestHandler之前坏掉,这就是正在发生的事情。

其次,你是在Alexa开发者控制台中培养Alexa托管技能,还是通过AWS托管自己的Lambda

Alexa主机为您创建了许多资源,包括Amazon S3存储桶和Amazon DynamoDb表,然后确保它为您创建的AWS Lambda在其环境变量中具有必要的角色设置和正确的信息。

如果您通过AWS托管自己的Lambda,您的Lambda将需要一个对S3资源具有读/写权限的角色,并且您需要将存储持久值的bucket设置为Lambda的环境变量(或者用包含bucket名称的字符串替换process.env.S3_PERSISTENCE_BUCKET(。

最新更新