5

I have a question about webhook connect.
I edited usually by inline editor of dialogflow.
But now I want to edit in my local.
So I did some setting watching two examples.

https://chatbotsmagazine.com/creating-nodejs-webhook-for-dialogflow-2b050f76cd75

https://github.com/dialogflow/fulfillment-temperature-converter-nodejs

[1] I made file,
      (1) Users/a/firebase.js
      (2) Users/a/functions/index.js (with package module)
      (3) webhook server by ngrok.
      (4) I attached this link 'https://ngrok~~/webhook' on dialogflow webhook

[2] firebase.js has

{}

[3] index.js has

'use strict';

const express = require('express');
const bodyParser = require('body-parser');
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const request = require('request');
const { dialogflow } = require('actions-on-google');
const app = dialogflow();
const admin = require('firebase-admin');
const server = express();

//admin.initializeApp();

process.env.DEBUG = 'dialogflow:debug';

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 hello(agent) {
    agent.add(`Welcome to my agent!`);
}

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

  let intentMap = new Map();
  intentMap.set('hello', hello);
  intentMap.set('Default Fallback Intent', fallback);

  agent.handleRequest(intentMap);
});

  var port = process.env.PORT || 3000;
  // create serve and configure it.

  server.get('/getName',function (req,res){
      res.send('Swarup Bam');
  });
  server.listen(port, function () {
      console.log("Server is up and running...");
  });



And server starts locally with ngrok port 3000.

I've written server.listen in my code.
But it seems that it doesn't have webhook post in my code.

So, in conclusion, when I write 'hello' in my dialogflow , ngrok gives a 404 not found error.

DD DD
  • 1,148
  • 1
  • 10
  • 33
  • Can you update your question to clarify what you mean by "doesn't have webhook output". What are you trying and what are you seeing when you try that? How are you starting the server locally? – Prisoner Dec 16 '18 at 13:48
  • Please update the question - don't try to do extensive answers in comments, just respond when you've updated the question. comments are best to request clarifications so we can create a question that explains your situation for you and for others who may have similar problems. – Prisoner Dec 16 '18 at 14:39
  • I edited my question and deleted comments. Thank you so much for advice how can use stackoverflow! :) – DD DD Dec 16 '18 at 14:59

1 Answers1

1

It looks like you have several things that you've mixed together.

Your node.js program is using two different methods to listen on a port, a way that is designed to use Cloud Functions for Firebase and a way that uses the express library, but you haven't indicated that you're running the program using either. Let's look at each thing that is (or should be) running

ngrok

ngrok is a port forwarder, so it assumes that there is another program that is running that is listening on the port you've specified. It does not start anything listening on that port itself.

Cloud Functions for Firebase

The portion starting with exports.dialogflowFirebaseFulfillment is for Cloud Functions for Firebase. Most examples from Google use this because it is easy to setup and use for beginners, scales well in production, and can use the monthly cloud credit from Google once you've deployed your Action. All the code inside this block is your webhook handler.

Code written for Cloud Functions for Firebase generally run on Google's servers, but for testing you can use the firebase serve --only functions command to run it locally.

express library

You've written code that starts listening on port 3000 and for a particular path (/getName), but what you're returning there doesn't call any of the webhook code that you have previously.

The req and res parameters match the request and response parameters in the Cloud Functions section (Cloud Functions just use express under the hood), so you could move your intent handling code to inside this express handler if you wanted.

Code that is written using the express library is started using the node command. You'll need a public server when you go to release your code - don't try to run a production-level server through ngrok to your home network connection.

Prisoner
  • 49,922
  • 7
  • 53
  • 105
  • Thank you so much, Prisoner. I figured out I have to study more basic things about server. I was just copy man. – DD DD Dec 16 '18 at 20:48
  • 1
    Hopefully the links I provided can get you started on the two different server technologies you can use. (I suggest Cloud Functions for Firebase - they're easy to get going and use.) – Prisoner Dec 16 '18 at 21:01