NodeJS 将参数传递给smooch-bot中的postback方法

50few1ms  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(101)

我在关注@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');
    }
}

});

字符串

问题

Q 0.我也是nodeJS的新手,我应该怎么称呼ADD_MOVIE,start,showUserMenu(在我的代码中)块?函数,方法,代码,模块等。
Q1.我在ADD_MOVIE块中调用了一个yts API。在script.js文件中调用API可以吗?
问题2.重要事项!:我如何将参数传递给我的回发与有效负载ADD_MOVIE,以便我可以在ADD_TO_FIREBASE块中执行一些条件代码

6ie5vjzr

6ie5vjzr1#

**Q0:**是风格问题。
**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'来解决promise链的最后一个问题,它告诉你的bot保持与之前相同的状态。

**Q2:**我看到两个选项。

  • 选项1:* 将电影ID附加到回发有效负载,例如ADD_TO_FIREBASE.movieid1ADD_TO_FIREBASE.movieid2等。

如果您这样做了,您将不得不在WebResourcePostback中定义自己的行为,从您的回发有效负载中解析出电影ID。
你还必须自己将amchine的状态转换为所需的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。操作按钮还允许您指定metadata对象。如果不使用内置的bot.say,您可以直接在API上发布消息,并且您可以将电影ID存储在操作元数据中。您仍然需要通过自定义handlePostback从该元数据中检索选定的movieId,就像您在选项1中所做的那样。

相关问题