通过参数在smooch-bot中回传方法

我从这里跟踪@dstoiko的答案

我正在调用ADD_MOVIE块中的API,并希望通过有效负载ADD_TO_FIREBASE传递一些值给我的回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,启动,showUserMenu(在我的代码)块? function,方法,代码,模块等

Q1。 我已经在我的ADD_MOVIE块中调用了一个yts api。 这是好的调用script.js文件中的API?

Q2。 重要!:如何将param传递给回发函数ADD_MOVIE,以便在ADD_TO_FIREBASE块中执行一些条件代码

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

Q1:是在receive数据库查询是好的,但是你的receive函数并没有等待查询完成,才能解决你的机器人状态。 例如,如果您不希望您的机器人在电影列表返回之后才接受用户input,则可以这样做:

 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中定义自己的行为,从回发的有效载荷中parsing出电影ID。

你也必须将你的状态机转换成你想要的ADD_TO_FIREBASE状态。 例如,从你的自定义handlePostback方法你可以这样做:

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

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