Dialogflow实现不能与Mongoose连接到MongoDB [英] Dialogflow fulfillment is not working with Mongoose to connect to MongoDB
本文介绍了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屋!
查看全文