【发布时间】:2019-08-22 11:16:35
【问题描述】:
我编写了一个使用 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 项目已经使用 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"
}
【问题讨论】:
-
我建议您使用外部节点服务器并将其部署到 vm 实例。先用 ngrok 调试,再上线
-
如果你能从云观察日志中给出错误日志也很棒
标签: node.js mongodb mongoose google-cloud-functions dialogflow-es