Как я показываю изображение из магазина Firebase, используя node.js - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь разработать чат-бота, используя Fulfillment (код с помощью Node.js) в Dialogflow и соединяюсь с Firebase.

Я сохранил изображение в Firestore.Я хочу показать это изображение, но я новичок в Node.js, Firebase и понятия не имею.

Я уже прочитал документацию для загрузки / выгрузки URL из Firestore, но я все еще не понимаюконцепция этого.

Не могли бы вы объяснить мне, как или формулировка для поиска?

Я хочу показать это изображение из хранилища

Ошибка: хранилище не определено.

'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 голосов
/ 01 марта 2019

эта проблема очень проста.Я просто воспринимаю это сильнее, чем должно быть.Просто используйте URL-адрес из Firebase Storage и поместите его в LINE API (.JSON).затем используйте диалог для ответа.

{
  "type": "image",
  "originalContentUrl": "/URL",
  "previewImageUrl": "/URL",
  "animated": false
}
0 голосов
/ 01 февраля 2019

Существует ряд проблем с вашим кодом, как логических, так и синтаксических.

Строка

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 теперь, когда он у вас есть.

Если все, что вам нужно, это показать изображение по этому URL как часть ответа Dialogflow, тогда вам не нужнопройти через 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);
...