在 DynamoDB 中搜索非主键并集成到 Alexa Skills

Searching DynamoDB for non primary keys and integrating into Alexa Skills

我正在尝试使用 AWS Lambda 搜索非主键并将其集成到 Alexa Skills Kit 中。我对使用 DynamoDB 和 Alexa Skills Kit 非常陌生,而且我正在努力在线寻找任何解决方案。我正在尝试做的事情的基本前提是使用两列(id 和 message)查询 table yesno。仅查看消息列以找到与我在 params 中指定的文本匹配的内容。

这是我正在使用的 Lambda 代码:

const AWSregion = 'eu-west-1';  
const Alexa = require('alexa-sdk');
const AWS = require('aws-sdk');

//params for searching table
const params = {
            TableName: 'yesno',
            Key:{ "message": 'Ben Davies' }
        };

AWS.config.update({
    region: AWSregion
});

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);

    // alexa.appId = 'amzn1.echo-sdk-ams.app.1234';
    // alexa.dynamoDBTableName = 'YourTableName'; // creates new table for session.attributes

    alexa.registerHandlers(handlers);
    alexa.execute();
};

const handlers = {
    'LaunchRequest': function () {
        this.response.speak('welcome to magic answers.  ask me a yes or no question.').listen('try again');
        this.emit(':responseReady');
    },


    'MyIntent': function () {
        var MyQuestion = this.event.request.intent.slots.MyQuestion.value;
        console.log('MyQuestion : ' + MyQuestion);

        readDynamoItem(params, myResult=>{
            var say = MyQuestion;
            say = myResult;

            say = 'you asked, ' + MyQuestion + '. I found a reckord for: ' + myResult;
            this.response.speak(say).listen('try again');
            this.emit(':responseReady');


        });

    },
    'AMAZON.HelpIntent': function () {
        this.response.speak('ask me a yes or no question.').listen('try again');
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.response.speak('Goodbye!');
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function () {
        this.response.speak('Goodbye!');
        this.emit(':responseReady');
    }
};

//  END of Intent Handlers {} ========================================================================================
//  Helper Function  =================================================================================================


function readDynamoItem(params, callback) {
    var AWS = require('aws-sdk');
    AWS.config.update({region: AWSregion});

    var dynamodb = new AWS.DynamoDB();

    console.log('reading item from DynamoDB table');

    dynamodb.query(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else{
            console.log(data); // successful response
            callback(data.Item.message);
        }               
    });

}

我知道我做的这件事可能完全错了,但是网上没有太多关于将 DynamoDB 与 Alexa Skill 集成的信息,我唯一能找到的就是通过 ID 搜索。如果不将 table 中的所有项目都拉到地图或列表中,这对我想做的事情不起作用,而且当我想创建一个大数据库时,它似乎效率很低。

在 Alexa 方面,我在测试代码时收到以下服务请求:

    {
  "session": {
    "new": true,
    "sessionId": "SessionId.f9558462-6db8-4bf5-84aa-22ee0920ae95",
    "application": {
      "applicationId": "amzn1.ask.skill.9f280bf7-d506-4d58-95e8-b9e93a66a420"
    },
    "attributes": {},
    "user": {
      "userId": "amzn1.ask.account.AF5IJBMLKNE32GEFQ5VFGVK2P4YQOLVUSA5YPY7RNEMDPKSVCBRCPWC3OBHXEXAHROBTT7FGIYA7HJW2PMEGXWHF6SQHRX3VA372OHPZZJ33K7S4K7D6V3PXYB6I72YFIQBHMJ4QGJW3NS3E2ZFY5YFSBOEFW6V2E75YAZMRQCU7MNYPJUMJSUISSUA2WF2RA3CIIDCSEY35TWI"
    }
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.7310073b-981a-41f8-9fa5-03d1b28c5aba",
    "intent": {
      "name": "MyIntent",
      "slots": {
        "MyQuestion": {
          "name": "MyQuestion",
          "value": "erere"
        }
      }
    },
    "locale": "en-US",
    "timestamp": "2018-01-25T14:18:40Z"
  },
  "context": {
    "AudioPlayer": {
      "playerActivity": "IDLE"
    },
    "System": {
      "application": {
        "applicationId": "amzn1.ask.skill.9f280bf7-d506-4d58-95e8-b9e93a66a420"
      },
      "user": {
        "userId": "amzn1.ask.account.AF5IJBMLKNE32GEFQ5VFGVK2P4YQOLVUSA5YPY7RNEMDPKSVCBRCPWC3OBHXEXAHROBTT7FGIYA7HJW2PMEGXWHF6SQHRX3VA372OHPZZJ33K7S4K7D6V3PXYB6I72YFIQBHMJ4QGJW3NS3E2ZFY5YFSBOEFW6V2E75YAZMRQCU7MNYPJUMJSUISSUA2WF2RA3CIIDCSEY35TWI"
      },
      "device": {
        "supportedInterfaces": {}
      }
    }
  },
  "version": "1.0"
}

我收到一个服务响应错误,只是说 'The response is invalid'

如有任何帮助,我们将不胜感激

我想在 dynamo 数据库部分帮助你。

为了访问 dynamodb 中的非主键列,您应该执行 scan 操作。

对于您的table(是否),id 是主键,message 是附加列。

访问非主键列的代码段[消息]

var dynamodb = new AWS.DynamoDB();
var params = {
    TableName: 'yesno',
    FilterExpression: 'message = :value',
    ExpressionAttributeValues: { 
        ':value': {"S": "Ben Davies"}
    }
};
dynamodb.scan(params, function(err, data) {
    if (err)  // an error occurred
    else console.log(data); // successful response
});

用于访问主键列 [Id]

的代码段
var docClient = new AWS.DynamoDB.DocumentClient();
//Get item by key
var params = {
    TableName: 'sis_org_template',
    Key: { "id": "1"}
};
docClient.get(params, function(err, data) {
    if (err)  // an error occurred
    else console.log(data); // successful response
});