dialogflow / dialogflow-fulfillment-nodejs

Dialogflow agent fulfillment library supporting v1&v2, 8 platforms, and text, card, image, suggestion, custom responses
Apache License 2.0
598 stars 281 forks source link

Error in Firebase logs: Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail #205

Open shivam-k opened 5 years ago

shivam-k commented 5 years ago

I am creating a bot on Dialogflow, and I am using Dialogflow-fulfillment for dynamic response and Firebase Real-time Database as a database.

What I am trying to do here is, suppose a hospital which provides certain facility has several centres(locations) in the country. Now when the user requests for such hospital, the bot should be able to output him the location of the nearby hospital. I do have the list of all such hospitals (with unique latitude & longitude) in Firebase Real-Time Database. My approach to this is that I will get the precise location of the user and compare it with locations available in the database to find the nearest hospital. Now I wish to output about this hospital to the user with extra information (like the address of the hospital, contact, website, opening hours, etc.) with the use of Google Place API (I have a billing account and API Key).

Although I am able to get the precise location of the user with longitude and latitude, I am facing some problems in dealing with Google Place API. Here are some errors that I am getting in "Firebase Logs":

Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail

and

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (/var/tmp/worker/node_modules/express/lib/response.js:767:10) at ServerResponse.send (/var/tmp/worker/node_modules/express/lib/response.js:170:12) at ServerResponse.json (/var/tmp/worker/node_modules/express/lib/response.js:267:15) at callPlaceAPI.then.catch (/user_code/index.js:480:34) at process._tickDomainCallback (internal/process/next_tick.js:135:7)

I tried changing many different ways of initialising firebase-admin, but the above error remains the same. I did this:

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: "https://test-dia.firebaseio.com"
});
process.env.DEBUG = 'dialogflow:debug'; 

and even this:

dmin.initializeApp({
  credential: admin.credential.cert({
      "type": "service_account",
      "project_id": "took from Firebase Generated Private Key",
      "private_key_id": "took from Firebase Generated Private Key",
      "private_key": "took from Firebase Generated Private Key",
      "client_email": "took from Firebase Generated Private Key",
      "client_id": "took from Firebase Generated Private Key",
      "auth_uri": "took from Firebase Generated Private Key",
      "token_uri": "took from Firebase Generated Private Key",
      "auth_provider_x509_cert_url": "took from Firebase Generated Private Key",
      "client_x509_cert_url": "took from Firebase Generated Private Key"
  }),
  databaseURL: "https://test-dia.firebaseio.com"
});
process.env.DEBUG = 'dialogflow:debug'; 

My package.json is:

{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.5.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "dialogflow": "^0.6.0",
    "dialogflow-fulfillment": "^0.6.0"
  }
}

Would you help me understand the problem? My index.js contains more than 600 lines of code, still, I am providing link to it for your consideration. Here: https://gist.github.com/shivam-k/49cfd05b36eb52d219f99b20cf285f03

Some important thing before you start reading the code:

{
   "candidates" : [
      {
         "formatted_address" : "140 George St, The Rocks NSW 2000, Australia",
         "name" : "Museum of Contemporary Art Australia",
         "opening_hours" : {
            "open_now" : false
         },
         "photos" : [
            {
               "height" : 3492,
               "html_attributions" : [
                  "\u003ca href=\"https://maps.google.com/maps/contrib/105784220914426417603/photos\"\u003eKeith Chung\u003c/a\u003e"
               ],
               "photo_reference" : "CmRaAAAA4fqUuhQuWUh11h_QEJJY5c14dM5V6tRjv9662oZdRxQdyvnmzK6b2ENgL9dtUb_bkSnIUTAzEmxdtJfLFQ1H_eqHDJkkiTedPu664OqkUOtxAfoBPCU01FOI1nN9RifJEhA47TjtbpLsT_yU6mfs8VZKGhRef9lr97rh2asJsCF3XBM-TH-InA",
               "width" : 4656
            }
         ],
         "place_id" : "ChIJ68aBlEKuEmsRHUA9oME5Zh0"
      }
   ],
   "status" : "OK"
}

Any suggestion on how to make a call to Place API and parse results from would be highly appreciated. Your any advice would be very encouraging to me.

NaveenSubburaj commented 5 years ago

Have you got any solutions?

shivam-k commented 5 years ago

@NaveenSubburaj, Unfortunately, no!

mirzakhalov commented 5 years ago

@shivam-k Solved the issue finally. Get the config variable from the firebase console directly and pass it on to your initialize function. It seems that database and google actions projects were not connected well. It would look something like this.

var config = { apiKey: "xxxxxxxx", authDomain: "xxxxxxx", databaseURL: "xxxxxx", projectId: "xxxxx", storageBucket: "xxxxx", messagingSenderId: "xxxxxx" };

const admin = require('firebase-admin'); admin.initializeApp(config);

Zeehshan commented 4 years ago

Any solved issue or not?

sauravotonobots1 commented 4 years ago

any luck?

AGU1988 commented 4 years ago

Anyone solved this issue?

mend3 commented 3 years ago

I've fixed this issue by creating an this environment var:

FIREBASE_CONFIG="{\"databaseURL\":\"https://{gcloud-project-id}.firebaseio.com\",\"storageBucket\":\"{gcloud-project-id}.appspot.com\",\"projectId\":\"{gcloud-project-id}\"}"

then

import * as admin from 'firebase-admin';

// start your app

admin.initializeApp(JSON.parse(FIREBASE_CONFIG));

// lots of code...

Naturally, replace {gcloud-project-id} with your actually project id.

shab1r commented 3 years ago

FIREBASE_CONFIG="{\"databaseURL\":\"https://{gcloud-project-id}.firebaseio.com\",\"storageBucket\":\"{gcloud-project-id}.appspot.com\",\"projectId\":\"{gcloud-project-id}\"}"

my project id is "test-v1" is this how I do it.

FIREBASE_CONFIG="{\"databaseURL\":\"https://test-v1.firebaseio.com\",\"storageBucket\":\"test-v1.appspot.com\",\"projectId\":\"test-v1\"}"

Could you tell me where I can put that? Do I just past it inside the index.js file.

I am using Google cloud platform with firestore. I do everything in the browser. I don't have any SDK's installed.