Dialogflow实现不能与Mongoose连接到MongoDB [英] Dialogflow fulfillment is not working with Mongoose to connect to MongoDB

查看:28
本文介绍了Dialogflow实现不能与Mongoose连接到MongoDB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个使用Mongoose连接到MongoDB并读取文档的基本函数。我在Cloud Functions中部署了代码。它使用来自MongoDB的文档正确响应。

var mongoose = require('mongoose');
var mongoDB = "mongodb://IP:port/db";
mongoose.connect(mongoDB, {
    useNewUrlParser: true
});
var db = mongoose.connection;
var Schema = mongoose.Schema;
var myCollection = new Schema({name: String,PO: String},{collections: 'myCollection'});
var myCollectionModel = mongoose.model('myCollection', myCollection, 'myCollection');

exports.helloWorld = (req, res) => {
  db.on('error', console.error.bind(console, 'connection error:'));
  myCollectionModel.find({name : "Jeeva"}, function(error, PO) {
      res.send(PO[0]);
  });
};

我按照以下方向编写代码以适应Dialogflow实现:当调用意图时,获取数据,将其返回给用户。

'use strict';
const admin = require('firebase-admin');
const functions = require('firebase-functions');

const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');

var mongoose = require('mongoose');
var mongoDB = "mongodb://IP:Port/db";
mongoose.connect(mongoDB, {useNewUrlParser: true});
var db = mongoose.connection;
var db = mongoose.connection;
var Schema = mongoose.Schema;
var myCollection = new Schema({name: String,PO: String},{collections: 'myCollection'});
var myCollectionModel = mongoose.model('myCollection', myCollection, 'myCollection');

process.env.DEBUG = 'dialogflow:debug';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

  function getData(name){
    var PO_number;
    myCollectionModel.find({name : "Jeeva"}, function(error, PO) {
      PO_number = PO[0].PO;
    });
    return PO_number;
  }

  function pending(agent){
    var name = agent.parameters.person;
    try{
      var PO_number = getData(name);
      agent.add(PO_number);
    }catch(error){
      agent.add(error.toString()); // Error: Unknown response type: "undefined"
    }
  }

  let intentMap = new Map();
  intentMap.set('pending-PO',pending);
  agent.handleRequest(intentMap);
});

它不工作了。我试图通过使用agent.add("here")一次一行来查看代码流。我注意到未执行获取数据的函数myCollectionModel.find

Dialogflow实现不支持Mongoose吗?它只支持FiRestore吗?我正在工作的Google项目已经使用了云数据存储,所以我无法创建Firebase数据库。如果MongoDB不工作,是否有Dialogflow Fulfulment支持的其他NoSQL数据库?

对话流完成日志:

{ 
 insertId: "xxx"   
   labels: { 
  execution_id: "xxx"    
 } 
 logName: "projects/project-name/logs/cloudfunctions.googleapis.com%2Fcloud-functions"   
 receiveTimestamp: "2019-08-22T10:24:25.605279456Z"   
   resource: { 
    labels: { 
   function_name: "dialogflowFirebaseFulfillment"     
   project_id: "project_id"     
   region: "us-central1"     
  } 
  type: "cloud_function"    
 } 
 severity: "DEBUG"   
 textPayload: "Function execution took 55 ms, finished with status code: 200"   
 timestamp: "2019-08-22T10:24:19.593202695Z"   
 trace: "projects/project_id/traces/xxx"   
}

推荐答案

您正在做的事情有两个问题,但是您可以同时解决或解决这两个问题。

首先,Dialogflow实现支持您的实现平台支持的任何内容。如果您使用的是内置的实现编辑器,则该编辑器在Firebase的云函数之上运行。您的第一个问题是,使用default pricing plan,您只能访问其他Google资源。您可以升级到"猛火计划",该计划包含一个免费级别,足以支持大多数开发和测试。

但是,一旦过了这个阶段,您的代码结构仍然存在问题。myCollectionModel.find()函数异步运行,您可以通过向其传递回调函数来处理它。此回调函数仅在获取数据时调用-但此时,getData()函数已返回未定义的值。

此外,如果您正在执行任何异步操作,Dialogflow库要求您使用JavaScript承诺,因此它知道在解析所有承诺之前不要发回响应。

我还没有对其进行测试,但我认为您可以将代码重写为如下所示:

  function getData(name){
    var PO_number;
    return myCollectionModel.find({name : "Jeeva"}).exec()
      .then( doc => {
        return Promise.resolve(doc[0].PO);
      })
  }

  function pending(agent){
    var name = agent.parameters.person;
    return getData(name)
      .then( PO_number => {
        agent.add( PO_number );
      })
      .catch( error => {
        agent.add(error.toString()); // Error: Unknown response type: "undefined"
      });
  }

这篇关于Dialogflow实现不能与Mongoose连接到MongoDB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆