wechaty / puppet-padlocal

Puppet PadLocal is a Pad Protocol for WeChat
https://wechaty.js.org/docs/puppet-providers/padlocal
Apache License 2.0
614 stars 86 forks source link

如何正确地处理底层RPC通信带来的异常情况? #234

Open shiyeling opened 1 year ago

shiyeling commented 1 year ago

比如我们用临时的token测试的过程中,发现 在TOKEN过期情况下,bot 启动的时候底层会抛错,但是BOT并不会停下来,会一直反复重试抛错 如下:

17:25:08 ERR [Request] [tid:a464bc97], padlocal grpc request failed: 1, error: Error: 16 UNAUTHENTICATED: Token is expired 17:25:08 ERR start client failed: VError: [tid:a464bc97] request has been cancelled for reason: SERVER_ERROR: 16 UNAUTHENTICATED: Token is expired at Request._failAllPendingRequest (D:\src\robot-manager\node_modules_padlocal-client-ts@0.5.3@padlocal-client-ts\src\Request.ts:338:15) at ClientDuplexStreamImpl. (D:\src\robot-manager\node_modules_padlocal-client-ts@0.5.3@padlocal-client-ts\src\Request.ts:82:12) at ClientDuplexStreamImpl.emit (node:events:513:28) at ClientDuplexStreamImpl.emit (node:domain:489:12) at Object.onReceiveStatus (D:\src\robot-manager\nodemodules\@grpc_grpc-js@1.8.13@@grpc\grpc-js\src\client.ts:692:18) at Object.onReceiveStatus (D:\src\robot-manager\nodemodules\@grpc_grpc-js@1.8.13@@grpc\grpc-js\src\client-interceptors.ts:417:48) at D:\src\robot-manager\nodemodules\@grpc_grpc-js@1.8.13@@grpc\grpc-js\src\resolving-call.ts:111:24 at processTicksAndRejections (node:internal/process/task_queues:77:11) 17:25:08 ERR [Request] [tid:dabe7392], padlocal grpc request failed: 1, error: Error: 16 UNAUTHENTICATED: Token is expired

我们代码中的异常捕捉逻辑似乎没有生效,下面会打印出'启动成功': bot.start().then(() => { log.info('启动成功') }).catch((error: any) => { log.error('-------------------------->>>> Bot start failed'); // 不会被回调执行 })

而这种情况下,bot的stop接口也没有把底层的请求循环停止: ` await neilBot?.weixinBot.stop()

log.info('--------------->Bot stopped') // 正常打印但是rpc的错误会持续 `

shiyeling commented 1 year ago

在puppet-padlocal.ts中 https://github.com/wechaty/puppet-padlocal/blob/fe1c768e4955f5845e04e1bf484aa18c0b5cfbd4/src/puppet-padlocal.ts#L222 在异常情况下都会重试登录操作。 是不是可以区分一下具体的异常,比如这种token过期,或者网络异常的时候,重试是没有意义的。