Search code examples
node.jsfirebasegoogle-cloud-functionsapi-ai

nodeJS request method not working, I am Pay as you go Plan


I am trying to hit a Railway API from firebase cloud function and it giving me the below error

I heard that request method doesn't work free plan, but its still not working even after I upgraded to pay as you go plan

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs // for Dialogflow fulfillment library docs, samples, and to report issues

'use strict';
var request = require('request');
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');

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


  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
}

   function welcome(agent) {

      var options = {
            url: 'http://api.railwayapi.com/v2/live/train/' + '17239' + '/date/' + '27-12-2018' + '/apikey/' + 'myjwjpywq4'
        }
        request(options, function (err, resp, body) {
console.log(body);

        })



     agent.add(`This message is from Dialogflow's Cloud Functions for Firebase editor!`);
         agent.add(new Suggestion(`Quick Reply`));
     agent.add(new Suggestion(`Suggestion`));
     agent.setContext({ name: 'weather', lifespan: 2, parameters: { city: 'Rome' }});
   }

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
 agent.handleRequest(intentMap);
});

Error:

TypeError: request is not a function
    at welcome (/user_code/index.js:33:9)
    at WebhookClient.handleRequest (/user_code/node_modules/dialogflow-fulfillment/src/dialogflow-fulfillment.js:303:44)
    at exports.dialogflowFirebaseFulfillment.functions.https.onRequest (/user_code/index.js:71:9)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9)
    at /var/tmp/worker/worker.js:725:7
    at /var/tmp/worker/worker.js:708:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

Solution

  • You have two definitions for request. Here's the first one:

    var request = require('request');
    

    Here's the second one, and it's masking the first one inside the body of your function:

    exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    

    When you call request() inside the body of your function, JavaScript thinks you mean the innermost request, which is the first argument passed to it. This is obviously not what you intended. At that point, request is not a function.

    Just give them different names so they don't collide with each other.