我尝试使用Dialogflow上的Fulfillment(使用Node.js的代码)开发chatbot并与Firebase连接。
我在Firestore中存储了一个图像。我想展示那个图片,但我是Node.js,Firebase的新手,我不知道。
我已经从Firestore上读过上传/下载URL的文档,但我仍然不明白它的概念。
你会向我解释搜索的方式或措辞吗?
I want to show this image from storage
Error: storage is not defined.
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
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));
var httpsReference = storage.refFromURL('https://firebasestorage.googleapis.com/v0/b/jenniebot2-94120.appspot.com/o/images%2FPicture5.jpg?alt=media&token=c853681b-2a72-45e4-ac7a-016f62396fa8');
function bodyMassIndex(agent) {
let weight = 80;
let height = 170/100;
let bmi = (weight / (height * height)).toFixed(2);
let result = "none";
if (bmi < 18.5) {
result = "xs";
} else if (bmi >= 18.5 && bmi <= 22.9) {
result = "s";
} else if (bmi >= 23 && bmi <= 24.9) {
result = "m";
} else if (bmi >= 25 && bmi <= 29.9) {
result = "l";
} else if (bmi > 30) {
result = "xl";
}
return admin.firestore().collection('bmi').doc(result).get()
.then(doc => {agent.add(doc.data().description);});
}
function welcome(agent) {
agent.add(`Welcome to my agent!`);
}
let intentMap = new Map();
intentMap.set('Default Welcome Intent', welcome);
intentMap.set('Bmi', bodyMassIndex);
agent.handleRequest(intentMap);
});
您的代码存在许多问题,包括逻辑和语法问题。
这条线
var httpsReference = storage.refFromURL('https://firebasestorage.googleapis.com/v0/b/jenniebot2-94120.appspot.com/o/images%2FPicture5.jpg?alt=media&token=c853681b-2a72-45e4-ac7a-016f62396fa8');
没有任何意义。在此之前你没有定义storage
,并且你以后任何地方都不使用httpsReference
。
给定URL,看起来这个文件存储在Firebase Cloud Storage中,这是一个存储和访问文件的好地方。这与Firebase Cloud Firestore数据库非常不同,storage
数据库擅长存储半结构化数据文档。
如果这是真的,那么你会用类似的东西创建var storage = admin.storage();
Storage
它说要从firebase管理员那里获取httpsReference
服务对象。
但如果这是真的 - 那么你现在不知道你打算用var card = new Card();
card.addTitle("BMI Chart");
card.addImage("https://firebasestorage.googleapis.com/v0/b/jenniebot2-94120.appspot.com/o/images%2FPicture5.jpg?alt=media&token=c853681b-2a72-45e4-ac7a-016f62396fa8");
agent.add(card);
对象做什么。
如果您要做的只是在Dialogflow响应中显示该URL的图像,那么您无需通过API - 您只需通过URL访问它。如果您现在在浏览器中加载该URL,您将看到该图像。
目前尚不清楚您是想将此作为卡中的图像还是作为响应中的独立图像,但无论如何,您只需要使用URL。也许是这样的
const {Image} = require('dialogflow-fulfillment');
var image = new Image();
image.setImage("https://firebasestorage.googleapis.com/v0/b/jenniebot2-94120.appspot.com/o/images%2FPicture5.jpg?alt=media&token=c853681b-2a72-45e4-ac7a-016f62396fa8");
agent.add(image);
要么
{
"type": "image",
"originalContentUrl": "/URL",
"previewImageUrl": "/URL",
"animated": false
}
这个问题很容易。我只是比它应该更难。只需使用URL表格Firebase存储并将其放入LINE API(.JSON)。然后使用dialogflow进行响应。
qazxswpoi