2016-08-24 6 views
0

私はsmooch-bot-exampleで作業しています。設定してHeroku Gitにアップロードしました。ボットの返信に成功しています。smooch-bot-exampleが別のブロックに切り替わらない

私は以下のシナリオで悩んでいます。ここに私のscript.jsファイルは、私がブロックTEST_ROUTに行きたい私は成功応答時に、私のADD_MOVIEブロックでyts Apiを呼び出してやっていること

'use strict'; 

const Script = require('smooch-bot').Script; 


var YtsHelper = require('./libs/YtsHelper.js'); 
const FirebaseHelper = require('./libs/FirebaseHelper.js'); 
var firebaseHelperObj = new FirebaseHelper(); 

module.exports = new Script({ 

processing: { 
    prompt: (bot) => bot.say('Beep boop...'), 
    receive:() => 'processing' 
}, 

start: { 
    receive: (bot) => { 
     return bot.say('Hi! I\'m Smooch Bot!') 
      .then(() => 'showUserMenu'); 
    } 
}, 

showUserMenu: { 

     prompt: (bot) => bot.say("Here are the areas I can help you out. %[Add Movie](postback:ADD_MOVIE) %[Serve Food](postback:SERVE_FOOD)"), 
     receive:() => 'finish' 
}, 

ADD_MOVIE : { 

    prompt: (bot) => bot.say('Enter movie name or keywords you want to search please.'), 
    receive: (bot) => { 

     bot.say("Search in progress...") 
     .then(() => { 
      // Call API Here 
      return bot.say("Search Finished.") 
      .then(() => 'TEST_ROUT') // Go to TEST_ROUT 
     }); 

    } 

}, 

TEST_ROUT: { 
     prompt: (bot) => bot.say("Test rout called"), 
     receive:() => 'showUserMenu' 
}, 


finish: { 
    receive: (bot, message) => { 
     return bot.getProp('name') 
      .then((name) => bot.say(`Sorry ${name}, my creator didn't ` + 
        'teach me how to do anything else!')) 
      .then(() => 'showUserMenu'); 
    } 
} 

}); 

(私のADD_MOVIEブロックを参照)であるが、私はHerokuのログでこれを取得しています。

2016-08-24T09:48:15.304174+00:00 app[web.1]: Undefined state 
undefined for user 1c91f4b02bf493fc6e8c606a,reverting to default state 'start' 

「開始」ブロックにリダイレクトされました。ここでは、ボット

私はここで間違ってやっている何

enter image description here

との会話の私のFacebookメッセンジャーのスクリーンショットはありますか? APIを呼び出す必要があることを覚えておいてください。成功するとブロックTEST_ROUTをリダイレクトする必要があります。溶液を塗布した後

アップデート1

、私は奇妙な出力を取得しています。

enter image description here

  • APIはここ

を結果の前にTEST_ROUTが呼ばれた私の更新ADD_MOVIEブロックは、あなたがのreceivereturnの文が欠落している今

TEST_ROUT: { 
     prompt: (bot) => bot.say("Test rout called"), 
     receive:() => 'showUserMenu' 
}, 

ADD_MOVIE : { 

    prompt: (bot) => bot.say('Enter movie name or keywords you want to search please.'), 
    receive: (bot, message) => { 
     const movie_name_searched = message.text; 
     return bot.say('Search in progress...') 
      .then(() => { 
       return YtsHelper.getMoviesList(movie_name_searched,function(movies_array){ 

        if(movies_array[0] != "ERROR_FOUND" && movies_array[0] != "NO_MOVIE_FOUND"){ 

         var movies_postbacks = ""; 
         for (var i = 0; i < movies_array.length ; i++){ 
          movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)"; 
         } 

         movies_postbacks = "Click any movie to add into firebase." + movies_postbacks; 
         bot.say(movies_postbacks); 

        }else{ 

         if(movies_array[0] == "ERROR_FOUND"){ 
          bot.say("ERROR Occured"); 
         }else if(movies_array[0] == "NO_MOVIE_FOUND"){ 
          bot.say("No movie found"); 
         } 
        } 
       }); 
      }) 
      .then(() => "TEST_ROUT"); 
    } 
}, 

答えて

2

です:画像を参照してください。 ADD_MOVIE

ADD_MOVIE : { 
    prompt: (bot) => bot.say('Enter movie name or keywords you want to search please.'), 
    receive: (bot) => { 
     return bot.say("Search in progress...") 
     .then(() => { 
       return callMyApi(); 
     }) 
     .then(() => bot.say("Search Finished.")) 
     .then(() => 'TEST_ROUT'); 
    } 
} 

アップデート1

getMoviesListへのお電話はコールバックではなく、promisesを使用していますので、あなたのメッセージは順不同で表示されている理由があります。

お約束であなたの呼び出しをラップし、代わりにそれを返す場合、それが動作するはずです:

return new Promise((resolve) => { 
    YtsHelper.getMoviesList(movie_name_searched, function(movies_array) { 
     if (movies_array[0] != 'ERROR_FOUND' && movies_array[0] != 'NO_MOVIE_FOUND') { 
      var movies_postbacks = ''; 
      for (var i = 0; i < movies_array.length; i++) { 
       movies_postbacks = movies_postbacks + ' %[' + movies_array[i] + '](postback:ADD_TO_FIREBASE)'; 
      } 

      movies_postbacks = 'Click any movie to add into firebase.' + movies_postbacks; 
      resolve(bot.say(movies_postbacks)); 
     } else { 
      if (movies_array[0] == 'ERROR_FOUND') { 
       resolve(bot.say('ERROR Occured')); 
      } else if (movies_array[0] == 'NO_MOVIE_FOUND') { 
       resolve(bot.say('No movie found')); 
      } 
     } 
    }); 
}); 
+0

はい、私はこれを知っています。 bot.Say( "Search in progress ...")とbot.say( "Search Finished。")の間にAPIを呼び出す必要がありますが、これをどのように達成するのでしょうか –

+0

また、内部にreturn文があります。再度確認してください –

+0

私の答えを編集しました。あなたの 'callMyApi'関数が約束を返す限り、それは – michaels

関連する問題