我试图根据Smooch回发负载将脚本从一种状态转换为另一种状态;但收到错误代码H12。

考虑示例https://github.com/smooch/smooch-bot-example

说我修改脚本https://github.com/smooch/smooch-bot-example/blob/master/script.js如下

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'
},

目的是使机器人的状态根据回发负载进行转换。

问题是,我该如何实现?

我的方法是添加
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)

无济于事。

最佳答案

我遇到了与[object Object]而不是字符串相同的问题。这是因为您通过函数获得或设置的state包含在一个对象中,而不是一个字符串...我在index.js中使用此代码修复了它,替换了smooch-bot-example GitHub存储库中现有的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列表中,如下所示:
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;的末尾写case

如果您想以其他方式处理其他回发,则可以在break;语句之后添加案例,然后执行其他操作。

希望这可以帮助!

10-06 08:29