Здесь есть несколько вопросов, некоторые из которых связаны, а некоторые нет. Давайте рассмотрим некоторые из них.
Для начала у вас есть сравнение
if( action === 'get.data' ){
но «действие» нигде не определено или не назначено. Таким образом, этот блок никогда не будет выполнен (и никогда не будет вызывать базу данных, похоже).
Не ясно, как вы выполняете некоторые задания. Когда вы получаете результат запроса, ваша строка
output = callDB().then( ( output ) =>{
, который, кажется, смешивает возвращение Обещания и пытается использовать результат выполнения Обещания. Я подозреваю, что второй «вывод» - это то, что вам нужно, а не первый, по причинам, которые, я надеюсь, немного яснее.
В этом предложении then()
вы отправляете обратно JSON, но затем также (за пределами предложения then()
) пытаетесь использовать библиотеку Dialogflow для установки контекста, установки ответа и предоставления подсказок. Смешивание этих двух методов не работает - либо отправьте JSON, либо используйте библиотеку.
Это усложняется, поскольку callDB()
(который вы вызываете до then()
) генерирует JSON для отправки обратно. Опять же - выберите один метод или другой. Я подозреваю, что лучшим подходом будет callDB()
фактически вызвать DB и, возможно, помассировать и вернуть Promise с результатами для вызывающего метода для форматирования в то, что вы хотите, чтобы пользователь услышал / увидел.
Говоря об обещаниях, хорошо , что callDB()
возвращает обещание. Однако вы не правильно воспринимаете это обещание двумя способами:
Во-первых, поскольку getInfo()
вызывает вещи, которые выполняются асинхронно (т. Е. - вызов callDB()
), он также должен возвращать Promise. Вот почему вы, вероятно, не хотели фиксировать результат из callDB()
, как я отмечал выше. Самый простой способ сделать это для вашего кода сделать что-то вроде
return callDB().then( output => {
// Output things are fine.
}).catch( err => {
// Output the world is ending.
};
Вторая проблема с тем, как вы работаете с Promises, заключается в том, что ваша текущая реализация getInfo()
имеет код после этого блока. В данный момент вы выполняете все вызовы agent.setContext()
и agent.add()
. Эти должны быть внутри блока then()
. (Где мой комментарий "все хорошо" выше.)