Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Smooch:如何进行依赖于回发的状态转换?_Javascript_Chatbot_Smooch - Fatal编程技术网

Javascript Smooch:如何进行依赖于回发的状态转换?

Javascript Smooch:如何进行依赖于回发的状态转换?,javascript,chatbot,smooch,Javascript,Chatbot,Smooch,我试图根据Smooch回发的有效负载将脚本从一种状态转换到另一种状态;但是获取错误代码H12 以这个例子为例 假设我修改脚本如下 start: { receive: (bot) => { return bot.say('Hi! I\'m Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye) ); } }, bye: { prompt: (bot) => bot.sa

我试图根据Smooch回发的有效负载将脚本从一种状态转换到另一种状态;但是获取错误代码H12

以这个例子为例

假设我修改脚本如下

start: {
    receive: (bot) => {
        return bot.say('Hi! I\'m Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye) );
    }
},
bye: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},
其目的是,服务器的bot状态将根据回发负载进行转换

问题是,我如何做到这一点

我的方法是添加

stateMachine.setState(postback.action.payload)
到github.com/smooch/smooch-bot-example/blob/master/heroku/index.js的handlePostback方法

然而,这抛出了一个错误代码H12。我还尝试了

stateMachine.transition(postback.action,postback.action.payload)

没有用。

回发不会自动将您的对话从一种状态转换到另一种状态,您必须自己编写该逻辑。幸运的是,您正在使用的smooch机器人示例已经在此处定义了回发处理程序:

所以不管你想要什么样的转换逻辑都应该放在里面。您可以通过创建一个状态机并以handleMessages()相同的方式对其调用
receiveMessage()。例如:

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

stateMachine.receiveMessage({
    text: 'whatever your script expects'
})

或者,如果希望回发的行为与常规文本响应不同,您可以让
handlePostback
实现调用
stateMachine.setState(state)
stateMachine.prompt(state)
独立运行。

我在[object object]而不是字符串上遇到了同样的问题。这是因为用函数获取或设置的
状态包含在对象中,而不是字符串中。。。我用
index.js
中的代码修复了它,替换了GitHub repo中现有的
handlePostback
函数:

function handlePostback(req, res) {

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

const postback = req.body.postbacks[0];
if (!postback || !postback.action) {
    res.end();
};

const smoochPayload = postback.action.payload;

// Change conversation state according to postback clicked
switch (smoochPayload) {
    case "POSTBACK-PAYLOAD":
        Promise.all([
            stateMachine.bot.releaseLock(),
            stateMachine.setState(smoochPayload), // set new state
            stateMachine.prompt(smoochPayload) // call state prompt() if any
        ]);
        res.end();
    break;

    default:
        stateMachine.bot.say("POSTBACK ISN'T RECOGNIZED") // for testing purposes
            .then(() => res.end());
};
}
然后在
script.js中,您需要做的就是定义与确切的回发有效负载相对应的状态。如果您有多个回发,应该将用户带到其他状态,只需将它们添加到
案例
列表中,如下所示:

case "POSTBACK-PAYLOAD-1":
case "POSTBACK-PAYLOAD-2":
case "POSTBACK-PAYLOAD-3":
case "POSTBACK-PAYLOAD-4":
Promise.all([
        stateMachine.bot.releaseLock(),
        stateMachine.setState(smoochPayload), // set new state
        stateMachine.prompt(smoochPayload) // call state prompt() if any
    ]);
    res.end();
break;
注意你不应该写
break案例的末尾添加code>

如果希望以不同的方式处理其他回发,可以在
中断后添加案例语句并执行其他操作


希望这有帮助

如果你想根据回发推进对话,你必须首先从机器人的提示中输出按钮(这样你可以在接收中处理按钮点击),修改
index.js
中的
handlePostback
函数,然后处理用户的“回复”在您的receive方法中-试试这个-修改
script.js
如下:

start: {
    prompt: (bot) => bot.say(`Hi! I'm Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye)`),
    receive: (bot, message) => {

      switch(message.text) {
        case 'Yes':
          return bot.say(`Ok, great!`)
            .then(() => 'hi')
          break;
        case 'No':
          return bot.say(`Ok, no prob!`)
            .then(() => 'bye')
          break;
        default:
          return bot.say(`hmm...`)
            .then(() => 'processing')
          break;          
      }
    }
},

hi: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},

bye: {
    prompt: (bot) => bot.say('Pleasure meeting you'),
    receive: () => 'processing'
},
然后修改
index.js
中的
handlePostback
函数,使其将回发视为常规消息:

function handlePostback(req, res) {

    const postback = req.body.postbacks[0];

    if (!postback || !postback.action)
        res.end();

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

    const msg = postback;

    // if you want the payload instead just do msg.action.paylod
    msg.text = msg.action.text;

    stateMachine.receiveMessage(msg)
      .then(() => res.end())
      .catch((err) => {
        console.error('SmoochBot error:', err);
        res.end();
      });
}

现在,当用户单击您的按钮时,它将被推到状态机,并像回复一样进行处理。

感谢您的回复。正如我在我的作品中提到的,我本以为这会奏效。不知道为什么没有。我分叉了smooch机器人示例并部署了它。bot不会进行状态转换。我做了两个改变。提前非常感谢。看起来您将回发响应视为用户消息说“是”或“否”,但您的script.js中没有处理这些响应的内容。请注意,script.js中的状态名称(“开始”、“再见”、“askName”)与用户的响应无关。您必须自己处理消息或回发事件,并定义状态应如何转换。例如,askName处理程序可以通过在此处解析字符串“finish”来转换为finish:您也可以按照我在回答中的建议使用stateMachine.setState。非常感谢。导致未定义状态[object]错误。导致状态转换。但是,如果您尝试,您将看到askName状态在不等待消息的情况下不断重复提示。当然,因为您没有定义任何名为“yes”或“no”的状态。堆栈溢出注释是调试这种事情的错误位置,我就到此为止。我相信你可以自己解决这个问题。这非常有用。谢谢这比我的黑客好得多。没问题!一开始有点让人不安,但我只是从
handleMessage
函数中得到灵感,解决了这个对象与字符串的问题。。。如果你认为有用,请投赞成票;-)我已经在我的回购协议中将正确答案归功于您,该协议实现了这一良好的操作,非常感谢。@sera您测试过我给您的答案了吗?我的在FB Messenger上似乎不起作用,在webchat版本上有时仍然有问题,仍然在一些对话的日志上抛出
[object object]
错误。。。