从其他服务访问Alexa会话持久性

时间:2019-06-27 00:55:49

标签: alexa

我具有Alexa主持的技能。我正在尝试找到一种从其他地方(例如angular 2.x)访问persistenceAdapter.S3PersistenceAdapter()的方法。可以做到这一点,还是我必须使用其他数据库替换S3?如果是这样,建议使用哪个数据库?

我使用一些示例代码从Alexa技能访问S3。我不知道attributeManager的工作原理,只是复制和粘贴。

.withPersistenceAdapter(
        new persistenceAdapter.S3PersistenceAdapter({bucketName:process.env.S3_PERSISTENCE_BUCKET})
    )

const attributesManager = handlerInput.attributesManager;
const sessionAttributes = await attributesManager.getPersistentAttributes() || {};
const temperature = sessionAttributes.hasOwnProperty('temperature') ? sessionAttributes.temperature : 0;

2 个答案:

答案 0 :(得分:0)

S3不是数据库-S3是对象存储。如果您需要数据库,则可以改用DynamoDB。听起来像是-您通常不会为此使用S3。

无论如何,您将无法在Angular或其他(非Alexa技能)项目中使用ASK SDK。但是,您可以使用AWS开发工具包连接到S3(或DynamoDB)。

https://github.com/aws/aws-sdk-js

您有3种类型的Alexa属性-请求,会话和持久性。我注意到您的变量名为sessionAttributes,但是您正在做getPersistentAttributes

以下是您如何使用withPersistentAdapter-https://www.talkingtocomputers.com/alexa-skills-kit-ask-sdk-v2#data-persistence

的示例

但是,这是使用DynamoDB的示例。这是更简单的IMO:

module.exports.handler = Alexa.SkillBuilders.standard()
    .addRequestHandlers(/* your handlers */)
    .withTableName(/* your table name (string) */)
    .withDynamoDbClient()
    .lambda()
}

然后您可以执行类似的操作(在异步函数中):

const att = await attributesManager.getPersistentAttributes()
const temperature = att.temperature ? att.temperature : 0

但是,当然,如果要访问该属性,则需要先在其中保存该属性。例如(在异步函数中):

const att = await attributesManager.getPersistentAttributes()

await attributesManager.setPersistentAttributes( { ...att, temperature: 10 }) // set the value
await attributesManager.savePersistentAttributes() // save it

答案 1 :(得分:0)

您可以使用S3存储桶,其语法如下所示,它们确实具有如上例中的持久性属性那样的get,set和save,对此您可以在Amazon Docs at the bottom.

const { S3PersistenceAdapter } = require('ask-sdk-s3-persistence-adapter');
const S3PersistenceAdapter = new S3PersistenceAdapter({ bucketName : 'FooBucket' })