【问题标题】:pass param to postback method in smooch-bot将参数传递给 smooch-bot 中的回发方法
【发布时间】:2016-08-26 02:18:49
【问题描述】:

我正在关注@dstoiko from here的回答

我在 ADD_MOVIE 块中调用 API,并希望通过有效负载 ADD_TO_FIREBASE 将一些值传递给我的回发

这是我的积木

'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, message) => {
        const movie_name_searched = message.text;
        return bot.setProp('movie_name_searched', movie_name_searched)
            .then(() => bot.say('Search in progress...'))
            .then(() => {
                YtsHelper.getMoviesList(movie_name_searched,function(movies_array){

                    var movies_postbacks = "";

                    console.log("Movies SIZE " + movies_array.length);

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

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

                });
            });
    }
},

ADD_TO_FIREBASE: {
        prompt: (bot) => bot.say("confirm, y/n"),
        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');
    }
}

});

问题

Q0。我也是nodeJS的新手,我应该怎么称呼ADD_MOVIE、start、showUserMenu(在我的代码中)块?函数、方法、代码、模块等

第一季度。我在我的 ADD_MOVIE 块中调用了一个 yts api。在script.js文件中调用API可以吗?

第二季度。重要!:如何使用有效负载 ADD_MOVIE 将参数传递给我的回发,以便我可以在 ADD_TO_FIREBASE 块中执行一些条件代码

【问题讨论】:

    标签: javascript node.js smooch


    【解决方案1】:

    Q0: 是风格问题,这里没有明确的答案。换句话说,这是这种讨论的错误论坛:) https://stackoverflow.com/help/how-to-ask

    Q1:是的,在 receive 中进行数据库查询很好,但是您的 receive 函数在解析您的机器人状态之前不会等待查询完成。例如,如果您不希望机器人在返回电影列表之前接受用户输入,您可以这样做:

    receive: (bot, message) => {
        const movie_name_searched = message.text;
        return bot.setProp('movie_name_searched', movie_name_searched)
            .then(() => bot.say('Search in progress...'))
            .then(() => {
                return new Promise((res) => YtsHelper.getMoviesList(movie_name_searched, (movies_array) => res(movies_array)));
            })
            .then((movies_array) => {
                    var movies_postbacks = "";
                    for (var i = 0; i < movies_array.length ; i++){
                        movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)";
                    }
    
                    return bot.say(movies_postbacks);
            })
            .then(() => bot.say("Click any movie to add into firebase."))
            .then(() => 'ADD_MOVIE');
    }
    

    请注意,我正在使用“ADD_MOVIE”解决承诺链的最末端,这会告诉您的机器人保持与以前相同的状态。

    Q2:我看到了两个选项。

    选项 1: 将电影 ID 附加到回发负载中,例如 ADD_TO_FIREBASE.movieid1ADD_TO_FIREBASE.movieid2 等等..

    如果您这样做,则必须在 handlePostback 中定义您自己的行为,该行为会从您的回发负载中解析出电影 ID。

    您还必须自己将状态机转换为所需的ADD_TO_FIREBASE 状态。例如,从您的自定义 handlePostback 方法中,您可以执行以下操作:

    const stateMachine = new StateMachine({
        script,
        bot: createBot(req.body.appUser)
    });
    stateMachine.setState('ADD_TO_FIREBASE');
    

    选项 2: 您使用的 %[foo](postback:bar) 消息实际上是一种速记语法。回发消息的真正内部工作是操作按钮,您可以将其发送到Smooch API directly。操作按钮还允许您指定 metadata 对象。如果不使用内置的bot.say,您可以直接通过 API 发布消息,并且可以将电影 ID 存储在动作元数据中。您必须再次通过自定义 handlePostback 从此元数据中检索选定的 movieId,就像您在选项 1 中所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2017-01-05
      相关资源
      最近更新 更多