Ошибка Dialogflow V2 - не работает асинхронный вызов - Ошибка Promise?функция пожарной базы - PullRequest
0 голосов
/ 11 июня 2018

Я хотел получить некоторые данные из mongodb (используя среду mongoose), но не смог получить данные,

ранее я использовал метод обратного вызова, как описано здесь для получения данных, которые работалихорошо для меня в " действие на Google v1", но не работает в v2,

, тогда я прочитал здесь , что нам нужно использовать обещание, чтобы сделать асинхронныйпозвоните в " action на google v2", затем я произвожу рефакторинг своего кода в соответствии с инструкцией Mr. @prisoner в приведенном выше вопросе

мой код можно посмотреть здесь:

import * as functions from 'firebase-functions';

import {
    dialogflow, 
    SimpleResponse,
    Suggestions, 
    DialogflowConversation, 
    DialogflowApp
} from 'actions-on-google'

import { Model } from './db'

const app = dialogflow({ debug: false })

app.middleware((conv) => {
    conv["hasScreen"] =
        conv.surface.capabilities.has('actions.capability.SCREEN_OUTPUT');
    conv["hasAudioPlayback"] =
        conv.surface.capabilities.has('actions.capability.AUDIO_OUTPUT');
});

app.intent('Get Some Data', (conv) => {    

        console.log("Get Some Data Intent triggered")

        return new Promise(function (resolve, reject) {

            Model.find({}, (err, result: any) => {
                if (!err) {

                    if (!result.length) {

                        console.log("no data found")
                        conv.ask(new SimpleResponse({
                            speech: "no data found"
                        }))
                        resolve();

                    } else {

                        console.log("lots of data found")
                        conv.ask(new SimpleResponse({
                            speech: "lots of data found"
                        }));
                        resolve();

                    }
                } else {
                    console.log("Error in getting data: ", err);
                    conv.ask(new SimpleResponse({
                        speech: "Error in getting data"
                    }))
                    resolve();
                }
            })
        })
});

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

он все еще не работает для меня, и функция заканчивается с таймаутом

На самом деле у меня правильно работает приложение в v1, и теперь я пытаюсь перейти с v1 на v2, так какМне нужно использовать некоторые новейшие функции, которые не доступны в v1, такие как голосовая аутентификация и другие новые функции.любая помощь будет тепло приветствоваться

1 Ответ

0 голосов
/ 11 июня 2018

Страница, на которую вы ссылались в документации Mongoose, в которой говорится о find(), также содержит информацию о том, как использовать ее с Обещаниями.Вызов find() возвращает запрос, и вы можете использовать query.exec(), чтобы получить обещание, с которым вы затем будете работать.

Таким образом, код может выглядеть примерно так (не проверено, поскольку я не использую Mongoose):

app.intent('Get Some Data', (conv) => {
  var query = Model.find({});
  return query.exec()

    .then( result => {
      if( !result || !result.length ){
        return conv.ask(new SimpleResponse({
          speech: "no data found"
        }));

      } else {
        return conv.ask(new SimpleResponse({
          speech: "some data found"
        }));
      }
    })

    .catch( err => {
      return conv.close(new SimpleResponse({
        speech: "something went wrong"
      }));
    });
});
...