登录
首页 >  Golang >  Go问答

为什么我的事件会被触发两次,尽管数据仅传递了一次?

来源:stackoverflow

时间:2024-03-18 15:24:31 233浏览 收藏

在使用 Go 语言开发的应用程序中,开发者遇到了事件被触发两次的问题,尽管数据只传递了一次。经分析发现,问题出在函数调用上。正确的调用方式应该是 go handleMessage(bot, msg, client),而不是 handleMessage(bot, msg, client),导致例程被调用了两次。修复此问题后,事件触发问题得到解决。

问题内容

因此,我在下面修剪了 go 代码,以便更好地理解,因为我正在使用库来实现此功能。

基本上我想做的是接收 json 文本,将其修剪成某种格式并将其传递给 createticket 函数。

一切正常,我的 createticket 函数使用来自replytext的正确主题字段创建它,但是每次我将 json 提供给我的应用程序时,createticket 都会运行几乎 2-3 倍,并且我的调试打印消息会打印几次。

在后端,createticket 将在我的系统上创建一个票证,当我在测试期间仅向系统提供一次 json 时,会出现 2-3 个新票证。

func handlemessage(bot *lark.bot, msg *lark.eventv2messagereceived, client *zendesk.client) {
    query := msg.message.content
    //fmt.println(query)
    var replytext replytext
    err := json.unmarshal([]byte(query), &replytext)
    if err != nil {
        log.fatal(err)
    }
    fmt.println(replytext.text)

    client.createticket(context.background(), zendesk.ticket{
        subject:  replytext.text,
        priority: "p2",
        comment: zendesk.ticketcomment{
            body: "testbody",
        },
    })

    //print("debug: msg handled and ticket created")
}

调用handlemsg()函数的代码是通过下面在我的服务器上监听的api调用。基本上只是一个事件处理程序,因此当我向下面的应用程序发送消息时,它会进行必要的检查,然后我会将收到的消息传递给函数,如下所示。

r.POST("/", func(c *gin.Context) {
    if evt, ok := middleware.GetEvent(c); ok {
        if evt.Header.EventType == lark.EventTypeMessageReceived {
            if msg, err := evt.GetMessageReceived(); err == nil {
                fmt.Println(msg.Message.Content)
                handleMessage(bot, msg, client)
                c.JSON(http.StatusOK, gin.H{"status": "ok"})
            }
        }
    }
})

正确答案


我错过了 handleMessage(bot, msg, client)

应该是 go handleMessage(bot, msg, client) 调用一次例程。

这解决了我的问题。

到这里,我们也就讲完了《为什么我的事件会被触发两次,尽管数据仅传递了一次?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>