Dialogflow fulfillment 无法与 Mongoose 一起连接到 MongoDB

Dialogflow fulfillment is not working with Mongoose to connect to 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 实现:调用意图时,获取数据,return 将其提供给用户。

'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 fulfillment 不支持 Mongoose 吗?它只支持 Firestore 吗?我正在处理的 Google 项目已经使用 Cloud Datastore,因此我无法创建 Firebase 数据库。如果 MongoDB 不起作用,是否有 Dialogflow Fulfillment 支持的任何其他 NoSQL 数据库?

Dialogflow 实现日志:

{ 
 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 fulfillment 支持您的 fulfillment 平台支持的任何内容。如果您使用内置的 Fulfillment 编辑器,它会在 Cloud Functions for Firebase 之上运行。您的第一个问题是,使用 default pricing plan,您只能访问其他 Google 资源。您可以升级到 "Blaze Plan",其中包括足以满足大多数开发和测试的免费套餐。

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

此外,Dialogflow 库 要求 您在执行任何异步操作时使用 JavaScript Promise,因此它知道不要先发回响应Promise 已解决。

我还没有测试过,但我认为您可以将代码重写成这样:

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