larksuite / node-sdk

larksuite open sdk for nodejs
MIT License
136 stars 27 forks source link

为什么飞书会回复多次呢? #43

Closed fu1996 closed 1 year ago

fu1996 commented 1 year ago

image

我按照readme.md 里的方式进行编写的,现在不知道是哪里出现了问题。无论是本地还是线上,飞书都会推送多次。导致重复回复

mazhe-nerd commented 1 year ago

看起来是没有及时响应飞书的推送,可以看下这里的描述:https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#9cd4c9b1

fu1996 commented 1 year ago

看起来是没有及时响应飞书的推送,可以看下这里的描述:https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#9cd4c9b1

感谢解答。 我还有如下疑问:

  1. 飞书重试以后如果返回了200的状态吗?此条消息不会在进行重试了吧?
  2. 怎么去看哪些消息进入了重试队列中呢?
  3. 飞书的重试的消息,如果我不想处理的话,应该怎么操作呢?是要给飞书服务端返回一个状态码为200 的空内容吗?这样他不会重发,并且不会发送出消息给信息发送人。
fu1996 commented 1 year ago

image 关于疑问3 我当前的做法是飞书 如果有重试的数据,我就直接return处理了,不知道飞书是否会对此条数据进行下次重试呢?还是标记为完成呢?

mazhe-nerd commented 1 year ago

问题1和问题3:只要给飞书的请求一个响应即可,响应内容不重要,飞书收到后就不会继续推送了。 问题2:目前应该是看不到的,我要在确定下,可以在业务侧手动维护一下状态

fu1996 commented 1 year ago

问题1和问题3:只要给飞书的请求一个响应即可,响应内容不重要,飞书收到后就不会继续推送了。 问题2:目前应该是看不到的,我要在确定下,可以在业务侧手动维护一下状态

我怎么去构造一个响应呢?我的目的是飞书不再继续推送,并且这个响应不会发送给信息发送人。 image 通过源码分析是,只要返回给飞书一个 {"code":0} 的对象就代表响应成功了吗?因为现在看不了那些是在重试队列中,所以有些难以判断此方法是否有效

mazhe-nerd commented 1 year ago

我怎么去构造一个响应呢?我的目的是飞书不再继续推送,并且这个响应不会发送给信息发送人。 image 通过源码分析是,只要返回给飞书一个 {"code":0} 的对象就代表响应成功了吗?因为现在看不了那些是在重试队列中,所以有些难以判断此方法是否有效

飞书的推送是针对事件而言的,响应这个事件只要给他回复一个status为200的http即可。上面这个截图看起来是一个api的调用,推送和这个无关。

咋们对齐一下这个问题:在代码中,注册了im.message.receive_v1事件来接收飞书推送的消息事件,拿到事件后,调用im.create方法来回复消息,现在消息会回复多次,不符合预期。

问题原因:由于没有给im.message.receive_v1一个返回,所以飞书认为这个消息推送失败了,详见文档,因此会重新推送,继而又触发这个注册了的响应函数,其中调用im.create方法来回复消息,表现上就是消息会回复多次。

解决方案:给im.message.receive_v1事件一个返回即可。可以抓包看看响应是否发送。

jokingzhang commented 1 year ago

使用koa-router 官方的适配器,没有返回200状态码,应该怎么解决?

mazhe-nerd commented 1 year ago

可能有2个原因:

  1. 注册的事件处理函数运行出错或者超时
  2. 使用的中间件运行有报错或者超时 建议看一下日志,debugger下代码