У вас есть несколько проблем в коде и подходе, которые вам нужно будет решить:
- Вам необходимо спроектировать базу данных, чтобы вы могли связать настроение пользователя с его учетной записью.(И, возможно, другую информацию о пользователе, такую как его имя или адрес электронной почты, пока вы там находитесь.)
- Вам нужна уникальная личность для человека.
- Имя человека не является уникальной личностью.Два человека могут иметь одно и то же имя, или система может слышать это имя каждый раз по-разному, поэтому вам необходимо знать, с кем вы разговариваете.
- Вам также необходимо знать их адрес электронной почты ивозможно, другую информацию, так что вы можете отправить им свой отчет в конце недели.
- Вы должны удостовериться, что у вас есть их личность между вызовами к вашему действию во время того же разговора.
К счастью, вы делаете одну вещь, которая обычно пропускается - вы делаете свои звонки в базу данных, используя Promises.Так что эта часть работает.
Уникальная идентификация
Ваш пример кода запрашивает у пользователя его имя, которое, как кажется, вы намереваетесь использовать в качестве его идентификатора.К сожалению, это плохая идея по нескольким причинам:
Имя не является личностью.Что произойдет, если два человека с одинаковыми именами получат доступ к вашему действию?
Имена легко обнаруживаются, поэтому другие люди могут использовать их и сообщать недостоверную информацию.Это не может быть слишком серьезным в вашем случае, но оно все же может иметь последствия для надежности.
Имена могут быть идентифицирующей личность информацией (PII), поэтому могут быть защищены дополнительными законами о конфиденциальности.
Пользователи могут захотеть закрыть свою учетную запись и не могут сделать это без «изменения» своего имени.
Кроме того, вам могут понадобиться другиеПозже идентификационные данные, такие как адрес электронной почты, и каждый раз запрашивать их могут стать проблематичными.
У вас есть несколько способов справиться с этим:
Если выРазрабатывая Google Assistant, вы также можете использовать Google Sign In for Assistant , который сообщит вам идентификатор пользователя Google, который вы можете использовать в качестве уникального идентификатора.Вы также получите их адрес электронной почты и имя как часть их профиля.
Вы можете запросить эту информацию (имя, адрес электронной почты и т. Д.) И сохранить ее под идентификатором пользователя, который вы генерируете илиимя пользователя, которое предоставляет пользователь.Этот идентификатор становится идентификатором.Если вы разрабатываете для Google Assistant, вы можете сохранить этот идентификатор в личном хранилище пользователя - только вы и пользователь имеете доступ к нему или можете удалить его.Если нет, вам может понадобиться использовать базу данных для поиска идентификатора.Подробнее об этом позже.
Возможно, вы захотите использовать варианты на этом более позднем этапе, в зависимости от того, какую информацию вы получаете и как вы хотите, чтобы пользователь каждый раз идентифицировал себя.Но важная часть заключается в том, что им нужно идентифицировать себя с чем-то уникальным, и вы можете легко их поймать.
Использовать идентичность в одном сеансе
Если вы используете Google Sign In, вам не нужно беспокоиться об этом.Вы будете получать один и тот же идентификатор для каждого сеанса и для каждого вызова во время сеанса.
Если вы используете личное хранилище пользователя с помощью Google Assistant, вы получите его как часть объекта userStore.
Но если это не так, вам нужно убедиться, что вы получили идентификатор пользователя в самом начале и сохранить его как часть Context , чтобы он сохранялся между вызовамиВаш веб-крючок.В последующих обработчиках вы можете получить идентификатор из контекста, а затем использовать его для доступа к другой информации.
Вам не нужно сохранять его в базе данных на данном этапе.Все, что у вас есть, это идентификатор - это ключ , который вы будете использовать для получения другой информации.Вам просто нужно запомнить это для последующих частей разговора.
Так что в вашей функции saveName()
это может выглядеть примерно так:
function saveName(agent) {
const nameParam = agent.parameters.name;
agent.add('Hi ' + nameParam + ' Are you ready to answer my question?');
agent.setContext({
name: 'user',
lifespan: 99,
parameters: {
id: nameParam
}
};
}
В качестве отступления - ваш обработчик, похоже, пытается определить, говорит ли это пользователь свое имя или подтверждает свое имя.Это, вероятно, лучше обрабатывать как отдельные намерения и отдельные обработчики.Попытка их объединить приведет к путанице.
Структурирование и доступ к вашей базе данных
У нас есть идентификатор.У нас есть пользователь, сообщающий данные.Как мы связываем эти два?
Существует много способов структурировать данные, и Firebase подробно разбирается в зависимости от того, как вы собираетесь их использовать, получать к ним доступ и делать их доступными для пользователей илидр.
В этом случае кажется довольно простым, что вы хотите хранить записи о пользователе.Каждая запись может использовать свой идентификатор в качестве ключа, а затем содержать некоторую информацию о пользователе, включая его настроение.
Одна приятная вещь в базе данных Firebase заключается в том, что вы можете (в основном) рассматривать ее как объект Javascript.Если мы подумаем об этом таким образом, это может выглядеть примерно так:
{
"user": {
"id1":{...},
"id2":{...},
"id3":{
"moods": [
{"mood":"good"},
{"mood":"tired"}
]
},
"id4":{...}
}
}
И так далее.В Firebase мы будем ссылаться на настроения пользователя "id3" с помощью пути, например user/id3/moods
.Если у нас есть идентификатор пользователя в переменной name
, мы могли бы использовать следующий код для получения этой ссылки
var ref = admin.database().ref('user').ref(name).ref('moods');
, а затем использовать такой код, чтобы поместить объект с настроением в массив (и верните обещание, которое нам нужно сделать):
var obj = {
mood: mood
};
return ref.push( obj ).then( snapshot => {
// Do stuff, including acknowledge to the user you saved it.
});
Имейте в виду, что вы также можете использовать это для хранения дополнительной информации о каждом пользователе (например, его имя или адрес электронной почты) на уровне пользователяили больше о настроениях (таких как отметка времени) в объекте настроения.