Динамическое использование языка представления Alexa

Я пытаюсь использовать язык презентации Alexa. Я хочу знать, как включить динамические строки (например, Output Speech и Title) в node.js (Binding, чтобы быть конкретным).

Если я использую некоторые статические строки для outputSpeech и помещаю их в apl_template_export.json, тогда навык работает правильно, и я могу видеть результат на Дисплее устройства. Но когда я пытаюсь использовать привязка, навык не выполняется. Хотя ошибки нет, но я также не вижу вывода на дисплее устройства (см. Изображение). введите здесь описание изображения

Вот что я пробовал до сих пор:

handlerInput.responseBuilder
            .addDirective({
                  type: 'Alexa.Presentation.APL.RenderDocument',
                  version: '1.0',
                  document: require('./apl_template_export.json'),
                  dataSources: {
                    "bodyTemplate1Data": {
                        "type": "object",
                        "objectId": "bt1Sample",
                        "title": urlParams.type,
                        "textContent": {
                            "primaryText": {
                                "type": "PlainText",
                                "text": outputSpeech
                            }
                        }
                    }
                  }
              })
            .speak(outputSpeech)
            .getResponse();

apl_template_export.json:

{
    "type": "APL",
    "version": "1.0",
    "import": [
        {
            "name": "alexa-layouts",
            "version": "1.0.0"
        }
    ],
    "mainTemplate": {
        "parameters": [
            "payload"
        ],
        "items": [
            {
                "type": "Text",
                "text": "${dataSources.bodyTemplate1Data.textContent.primaryText.text}"
            }
        ]
    }
}

Если я заменю ${dataSources.bodyTemplate1Data.textContent.primaryText.text} фактическим текстом (например, "Hello World"), навык будет работать должным образом.

Я взял ссылку из здесь и здесь, исходный репозиторий: https://github.com/alexa-labs/skill-sample-nodejs-level-up-riddles

Может ли кто-нибудь сказать мне, что здесь не так?

ОБНОВИТЬ

Я изменил переменную text на это:

"items": [
            {
                "type": "Text",
                "text": "Type: ${type}\nDatasources: ${dataSources != null} \nBodyTemplate: ${dataSources.bodyTemplate1Data != null}"
            }
        ]

И я получаю это как результат:

Type: undefined
Datasources: false 
BodyTemplate: false 

Таким образом, проблема не в рендеринге вывода, вместо этого шаблон не может загрузить dataSources, это и есть настоящая проблема.

Он даже не может загрузить type переменную, значение которой уже определено в шаблоне.


person Nikhil Wagh    schedule 07.01.2019    source источник
comment
Можете ли вы зафиксировать ошибку облачных часов и опубликовать ее в своем вопросе?   -  person Amod Gokhale    schedule 07.01.2019
comment
Ошибки нет. Я получаю вывод (см. Изображение). Но устройство отображения Alexa не может его отобразить.   -  person Nikhil Wagh    schedule 07.01.2019
comment
пожалуйста, подтвердите в журналах ... получение вывода не означает, что ошибки нет. Я получал ту же ошибку, и просмотр журналов помог мне в дальнейшем (вывод виден, но пользовательский интерфейс пуст). У вас также определен SessionEndedRequestHandler? попробуйте прокомментировать это   -  person Amod Gokhale    schedule 07.01.2019
comment
Я проверил последние 5 записей в журналах, и ошибок не было. И я определил свой SessionEndedRequestHandler. Но я думаю, что проблема не в SessionEndedRequestHandler, поскольку я еще запускаю Навык и завершаю его. (shouldEndSession это False)   -  person Nikhil Wagh    schedule 07.01.2019
comment
@AmodGokhale, пожалуйста, посмотрите обновление в вопросе.   -  person Nikhil Wagh    schedule 07.01.2019


Ответы (1)


Если вы создаете template из APL Authoring Tool, то вот что нужно запомнить:

  1. Добавляя directive к вашему responseBuilder, убедитесь, что вы добавили key с именем datasources.
  2. При ссылке на datasource из вашего шаблона убедитесь, что вы указали его как payload. Итак, ваш datasource обозначается как payload.

Например:

datasources : {
    'type': 'AlexaHeader',
    'text': {
        'value': 'Hello World'
    }
}

Если вы хотите получить доступ к value, укажите его как ${payload.text.value}.

  1. Если это не сработает, повторно включите APL с консоли.
person Nikhil Wagh    schedule 12.01.2019