Alexa Skill S3 在参数中缺少必需的密钥桶

Alexa Skill S3 missing required key Bucket in params

我正在尝试基于 Cake Time Tutorial 制作技能,但每当我尝试调用我的技能时,我都会遇到一个错误,我不知道为什么。

这是我的调用函数。

    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 hoje?”但它出于某种原因尝试访问 amazon S3 存储桶并在控制台上打印此错误。

~~~~ 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 skill builder 中添加 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();

这些是我创建的意图 Intents

这是处理它们的函数。

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;

任何帮助将不胜感激。

instead it tries to access amazon S3 bucket for some reason

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

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

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

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

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