actions on google での cheerio-httpcliを使ったスクレイピングで、fetchメソッドが動かない


初めて質問させていただきます。  
Google Homeで、ある対戦ゲームのキャラクターに対する不利なキャラクターを教えてくれるアプリを作っています。  
DialogflowのWebhook(firebase)を通して処理しています。

index.js内の処理内容としては、「<キャラクター名>のカウンター」で音声入力した際に、  
こちらの統計サイト(<http://jp.op.gg/champion/><キャラクター名>/statistics/)にある  
Weak against欄の一番上のキャラクター名をスクレイピングで取得して、google assistantに返すというものになります。

スクレイピングはcheerio-httpcliというモジュールを使っています。

しかし、スクレイピングでの取得処理部分であるfetchメソッドが処理されていないようで、  
fetchメソッド内のapp.askが動いておらず、変数nameの中身がundefinedとなっています。  
なお、firebase deploy --only functions コマンドではエラーは出ていません。

スクレイピング処理の部分のみを抜き出して、別ファイルでコンソール出力した際はうまくできたのですが、  
actions on googleもしくはfirebase と組み合わせるとうまくいかないです。  
ご教授お願いいたします。

index.js

[code]

    'use strict';
    
    process.env.DEBUG = 'actions-on-google:*';
    const { DialogflowApp } = require('actions-on-google');
    const functions = require('firebase-functions');
    
    exports.yourAction = functions.https.onRequest((request, response) => 
    {
      const app = new DialogflowApp({request, response});
    
      const WELCOME_INTENT = 'input.welcome';
      const UNKNOWN_INTENT = 'input.unknown';
      const END_INTENT = 'default_end_intent';
      const CHAMPION_COUNTER = 'Champion_Counter';
    
      var client = require('cheerio-httpcli');
    
      console.log('Request headers: ' + JSON.stringify(request.headers));
      console.log('Request body: ' + JSON.stringify(request.body));
    
      // Fulfill action business logic
      function responseHandler (app) {
        // Complete your fulfillment logic and send a response
        let intent = app.getIntent();
    
        switch (intent) {
            case WELCOME_INTENT:
                app.ask('ようこそ、LoLSmartCallへ');
                break;
    
            case UNKNOWN_INTENT:
                app.ask('もう一度お願いします');
                break;
    
            case END_INTENT:
                app.tell('ありがとうございました');
                break;
    
            case CHAMPION_COUNTER:
                let requestChampionName = app.getArgument('LoL-Champions'); //音声入力されたキャラクター(チャンピオン)の名前が入る
                let name = counterResearch(requestChampionName);
                app.ask(requestChampionName + 'の苦手なチャンピオンは、' + name + 'です。');
    
                break;
    
        }
      }
    
      app.handleRequest(responseHandler);
    
      function counterResearch(requestName) {
          var url = 'http://jp.op.gg/champion/' + requestName + '/statistics/';
          //ここまで動いていること確認済み
    
          //TODO ⇓ここから動かない
          client.fetch(url, {}, function(err, $, res, body){
    
              $('.SideContent').each(function (idx){
                  //console.log('Weak against');
                  app.ask('動いています');    //動かない
                  var championName = $(this).find('.ChampionName').eq(0).text();
              });
              return championName;
          });
      }
    });
    
[/code]

[![シミュレータ](https://i.stack.imgur.com/D0SMw.png)](https://i.stack.imgur.com/D0SMw.png)




Firebaseのプランは課金、または定額プランですか?  
無料プランのCloud FunctionsはGoogle以外のネットワークの外部通信に制限があります。

<https://firebase.google.com/pricing/>

従量課金のプランでも無料枠は存在するのでそちらに切り替えるか  
AppEngineなどのGoogleの別のプロダクト経由で通信するとよいでしょう。

