Запустите файл export.handle в файле AnswerIntentHandler - node.js - навык alexa - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я разрабатываю навык Amazon Alexa, который запрашивает у пользователя цвет.Пользователь вводит цвет голосом, и Alexa проверяет, находится ли цвет в определенном массиве значений.Если это так, он возвращает имя цвета с идентификатором.Теперь это работает как задумано, но теперь я хотел бы поместить это значение в AWS DynamoDB.Я прочитал несколько руководств по подключению и записи в DynamoDB с использованием AWS Lambda (Runtime Node.js 8.10). Итак, в следующем коде вы можете увидеть мой AnswerIntentHandler моего Alexa Skill.Я включил экспорт.дескриптор функции для записи значения идентификатора цвета и названия цвета в таблице с именем «alexa_farbe».Но когда я симулирую Skill с разработчиком Alexa Skill, код выдает только «speechText» и, похоже, не запускает код для записи в DynamoDB.Возможно, невозможно запустить файл export.handle в AnswerIntentHanlder или это так?Я очень новичок в этой теме, поэтому я не совсем уверен, где ошибка в этом коде.Я предоставляю код моего AnswerIntentHandler, но я также могу предоставить весь код Alexa Skill.Я надеюсь, что кто-нибудь может дать мне подсказку, что делать.

const AnswerIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name ===   'AnswerIntent';
  },
  handle(handlerInput) {
    const slots = handlerInput.requestEnvelope.request.intent.slots;
const number = slots['FarbAuswahl'].value;
var numberid = slots['FarbAuswahl'].resolutions.resolutionsPerAuthority[0].values[0].value.id; /* ID der Farbe auslesen */

var speechText = 0;

 speechText = `Prima, ich stelle die Farbe ${number} mit der ID ${numberid} ein!`;


/* Ab hier Versuch in die Datenbank DynamoDB zu schreiben */

exports.handle = function(e, etx, callback) {

    var params = {
        Item: {
            ID: '${numberid}',
            Farbname: '${number}'
        },

        TableName: 'alexa_farbe'
    };

    docClient.put(params, function(err, data) {
        if(err) {
            callback(err, null);
        } else {
            callback(null, data);
        }


    });
};    

  return handlerInput.responseBuilder
  .speak(speechText)
  .withSimpleCard('Ausgewählte Farbe:', speechText)
  .getResponse();

},


};

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я попытался отредактировать код и поместить всю публикацию DynamoDB в другой файл с именем dynamicodb.js.Это содержание:

const AWS         = require('aws-sdk');
const docClient   = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});

exports.handle = function(e, ctx, callback) {

var params = {
    Item: { 
    date: Date.now(),
    message: "This hopefully works"

    },

    TableName: 'alexa_farbe'

};

docClient.put(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
 }
 });
};

Я просто хочу записать дату и пример фразы в мою DynamoDB.

Чтобы вызвать эту функцию, я попытался реализовать своего рода «runScript»в мой AnswerIntentHandler моего навыка Алекса.Но это не похоже на запуск файла.Можете ли вы дать мне несколько советов, что не так с этим кодом и как вызвать другой файл node.js из AnswerIntent.Вот мой отредактированный AnswerIntent:

const AnswerIntentHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
  && handlerInput.requestEnvelope.request.intent.name ===   'AnswerIntent';
},
handle(handlerInput) {
const slots = handlerInput.requestEnvelope.request.intent.slots;
let number = slots['FarbAuswahl'].value;
let numberid =       slots['FarbAuswahl'].resolutions.resolutionsPerAuthority[0].values[0].value.id; /* ID   der Farbe auslesen */

var speechText = 0;

speechText = `Prima, ich stelle die Farbe ${number} mit der ID ${numberid} ein!`;

 module.runScript('./some-script.js', function (err) {
  if (err) throw err;
  console.log('finished running some-script.js');
 });



 return handlerInput.responseBuilder
 .speak(speechText)
 .withSimpleCard('Ausgewählte Farbe:', speechText)
 .getResponse();

},

};
0 голосов
/ 18 ноября 2018

Вы не должны помещать код в exports.handler. Пожалуйста, посмотрите на этот пример (код поддержки DynamoDB находится в файле helpers.js). По совпадению это также работает с цветами.

Если данные, которые вы храните, связаны с каждым пользователем навыка (например, атрибутом пользователя), гораздо более простой способ сделать постоянство DynamoDB состоит в использовании ASK постоянных атрибутов (уже поддерживается в ASK SDK ).

...