Не удается прочитать свойство 'параметры' из неопределенного при передаче контекста - Действия в Google - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я пытаюсь разработать действие.

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

Я реализовал логику, которая работает локально, но, к сожалению, я всегда получал первые три элемента из списка.Поэтому я попытался использовать контекст, где я хочу передать индекс в качестве параметра, и здесь я столкнулся с проблемой.Журналы облачной функции всегда дают мне:

Невозможно прочитать свойства 'параметров' из неопределенного.

Я использую API-интерфейс v2 и действия в Google SDK.Следующая ссылка предоставляет пример того, как реализовать контекст, и я не вижу большой разницы там.https://developers.google.com/actions/reference/nodejsv2/overview

Код, написанный для него, выглядит следующим образом:

app.intent('Default Welcome Intent', conv => {
    conv.ask('Welcome.')

    const lifespan = 100;
    const parameters = {
        index: 0,
    };
    conv.contexts.set('movieCtx', lifespan, parameters);
});

app.intent('New Cinema Movies Intent', async conv => {
    let movieCtx = conv.contexts.get('movieCtx');
    let index = movieCtx.parameters[index]

    let movieRepository = new MovieRepository();
    movieRepository.index = index;
    await movieRepository.fetchNextTitle(3).then(function(titles) {
        movieCtx.parameters[index] = movieRepository.index;
        conv.ask('The 3 movies are:' + titles.join(', '))

        return true;
    }).catch(function(err) {
        console.log(err); 
        return false;
    });
})

Мои зависимости:

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "dependencies": {
    "actions-on-google": "^2.5.0",
    "firebase-admin": "~6.0.0",
    "firebase-functions": "^2.0.3",
    "pg": "^7.7.1"
  },
  "devDependencies": {
    "eslint": "^4.12.0",
    "eslint-plugin-promise": "^3.6.0"
  },
  "private": true
}

Обновление:

Я также пытался изменить следующие строки, но это не помогло мне:

const parameters = {
        movieIndex: 0,
};

let index = movieCtx.parameters['movieIndex']

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Мне удалось найти ответ!

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');
const MovieRepository = require('./PostgreSQL/MovieRepository');
let movieRepository = new MovieRepository();

const app = dialogflow({debug: true});

const AppContexts = {
    NUMBER: 'number',
}

app.intent('Default Welcome Intent', (conv) => {
    const lifespan = 10;
    const parameters = {
        movieIndex: 0,
    };
    conv.contexts.set(AppContexts.NUMBER, lifespan, parameters);
    conv.ask('Welcome!')
});

app.intent('New Cinema Movies Intent', async (conv) => {
    const movieCtx = conv.contexts.get(AppContexts.NUMBER);

    await movieRepository.fetchNextTitle(3).then(function(titles) {
        movieCtx.parameters.movieIndex = movieRepository.index;
        conv.ask('The 3 movie titles are: ' + titles.join(', '));
        return true;
    }).catch(function(err) {
        console.log(err); 
        return false;
    });
})

app.intent('Default Fallback Intent', conv => {
    conv.ask('Sorry. Can you repeat?')
})

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Как вы видите, вы должны создать AppContext выше намерений.Как ни странно, но важно то, что вы применяете

NUMBER: 'number'

к контексту, в противном случае вы снова получаете неопределенный контекст.И для доступа к вашим параметрам вам просто нужно добавить значение вашего параметра следующим образом:

movieCtx.parameters.movieIndex
0 голосов
/ 08 декабря 2018

Строка

let index = movieCtx.parameters[index]

Вероятно, должна быть

let index = movieCtx.parameters['index']

(у вас нет index, определенного до этого, поэтому она пытается получить ссылку на undefined, что недействительно.)

...