首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alexa技能S3缺少对齐中所需的密钥桶

Alexa技能S3缺少对齐中所需的密钥桶
EN

Stack Overflow用户
提问于 2021-04-05 18:33:44
回答 1查看 267关注 0票数 0

我试图在蛋糕时间教程基础上生成一种技能,但是每当我试图调用我的技能时,我都会遇到一个错误,我不知道为什么。

这是我的调用函数。

代码语言:javascript
复制
    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();
       },
     };

它只会提示一个葡萄牙语的信息"Bem vindo,que série vai assistir?“但相反,它试图访问AmazonSAB桶,但出于某种原因,它在控制台上打印了此错误。

代码语言:javascript
复制
~~~~ 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 (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\utils\AskSdkUtils.js:22:17)
    at S3PersistenceAdapter.<anonymous> (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:90:45)
    at step (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:44:23)
    at Object.throw (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.js:25:53)
    at rejected (path\MarcaEpisodio\lambda\node_modules\ask-sdk-s3-persistence-adapter\dist\attributes\persistence\S3PersistenceAdapter.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信息,但我认为它们与目的无关。

我唯一能想到的调用是当我在alexa技能构建器中添加S3适配器时。

代码语言:javascript
复制
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();

这些是我创建意图的意图

这就是应该处理这些问题的函数。

代码语言:javascript
复制
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;

任何帮助都会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-05 21:19:52

相反,它试图以某种原因访问亚马逊的S3桶。

首先,在对意图处理程序的canHandle函数进行轮询之前,将在每次使用中加载和配置持久性适配器。然后在RequestInterceptor中使用持久性适配器,然后再对其中的任何一个进行轮询。

如果存在问题,在您到达LaunchRequestHandler之前,它就会崩溃,这就是正在发生的事情。

第二,您是在Alexa开发人员控制台中构建Alexa托管的技能,还是通过AWS承载自己的Lambda?

Alexa托管为您创建了许多资源,包括一个亚马逊S3桶和一个DynamoDb表,然后确保它为您创建的Alexa在其环境变量中具有必要的角色设置和正确的信息。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66957985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档