我如何使用node.js从商店Firebase显示图像

时间:2019-01-30 03:08:05

标签: node.js firebase dialogflow chatbot

我尝试通过在Dialogflow上使用Fulfillment(使用Node.js进行编码)来开发聊天机器人,并与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);
});

2 个答案:

答案 0 :(得分:0)

您的代码存在很多逻辑和语法问题。

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();

表示要从firebase管理员获取Storage服务对象。

但是,如果这是真的-那么现在尚不清楚您打算使用httpsReference对象做什么

如果您要做的只是作为Dialogflow响应的一部分在该URL上显示图像,则无需通过API,您只需通过URL即可访问它。如果您立即在浏览器中加载该URL,则会看到该图像。

尚不清楚是要将其作为卡中的图像还是响应中的独立图像,但是无论哪种方式,您都只需要使用URL。也许像

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

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

答案 1 :(得分:0)

这个问题很容易。我只是要比应该做的难。只需使用Firebase存储形式的URL,并将其放在LINE API(.JSON)中即可。然后使用dialogflow进行响应。

{
  "type": "image",
  "originalContentUrl": "/URL",
  "previewImageUrl": "/URL",
  "animated": false
}