首页 > 解决方案 > Dialogflow V2 错误 - 异步调用不起作用 - 承诺错误?火力基地功能

问题描述

我想从 mongodb 获取一些数据(使用 mongoose 框架)但无法获取数据,

以前我使用这里描述的回调方法来获取在“谷歌v1 上的操作”中对我来说效果很好但在 v2 中不起作用的数据,

然后我在这里读到我们必须使用promise才能在“对google v2的操作”中进行异步调用,然后我根据上面问题中@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 中不可用的一些最新功能,例如语音身份验证和其他新功能。任何帮助都将受到热烈欢迎

标签: node.jsmongoosees6-promiseactions-on-googledialogflow-es

解决方案


您在讨论的 Mongoose 文档中find()引用的页面还提供了有关如何将其与 Promises 一起使用的信息。该find()调用返回一个查询,您可以使用它query.exec()来获取您将使用的 Promise。

所以代码可能看起来像这样(未经测试,因为我不使用猫鼬):

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"
      }));
    });
});

推荐阅读