0

私はsmooch-bot-exampleに取り組んでおり、セットアップして Heroku Git にアップロードしました。ボットが正常に返信しています。

以下のシナリオで立ち往生しています。ここに私のscript.jsファイルがあります(私のADD_MOVIEブロックを見てください)

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

});

私がやったことは、私のブロックでyts ApiADD_MOVIEを呼び出すことです。成功した場合、ブロックに行きたいのですTEST_ROUTが、Heroku ログでこれを取得しています。

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

「開始」ブロックにリダイレクトされます。これは、ボットとの会話の Facebook Messenger のスクリーンショットです。

ここに画像の説明を入力

ここで何が間違っていますか?TEST_ROUTAPI を呼び出す必要があり、成功するとブロックをリダイレクトする必要があることに注意してください。

更新 1

ソリューションを適用した後、奇妙な出力が得られます。画像を参照してください:

ここに画像の説明を入力

  • TEST_ROUT は API の結果の前に呼び出されます

これが私の更新されたADD_MOVIEブロックです

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");
    }
},
4

1 に答える 1

2

of にreturnステートメントがありません:receiveADD_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

メッセージが順不同で表示される理由は、 への呼び出しが promise ではなくコールバックを使用getMoviesListしているためです。

呼び出しを Promise でラップし、代わりにそれを返すと、動作するはずです。

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'));
            }
        }
    });
});
于 2016-08-24T12:03:24.497 に答える