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"
});
}
我编写了一个使用 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"
});
}