我有一个React应用程序,该应用程序使用Twilio可编程聊天库提供聊天功能。设置代码通常如下所示,全部包裹在try / catch块中:
this.accessManager = new AccessManager(twilioToken.token);
const chatClientOptions = config.debugMode ? { logLevel: 'debug' } : {};
this.chatClient = await TwilioChat.Client.create(twilioToken.token, chatClientOptions);
// Regsiter chatClient to get new access tokens from AccessManager
this.accessManager.on('tokenUpdated', function(am) {
console.log("Chat client getting new token from AccessManager");
// get new token from AccessManager and pass it to the library instance
self.chatClient.updateToken(am.token);
});
// IF accesstoken expries, grab a new one from the server
this.accessManager.on('tokenExpired', async function() {
console.log("Chat access token expired. Requesting new one from server...");
// generate new token here and set it to the accessManager
const updatedToken = (await axios.get(`/users/${user.publicId}/twilioToken`)).data;
self.accessManager.updateToken(updatedToken.token);
});
this.channel = await this.createOrGetChannel();
createOrGetChanne()获取频道,然后我们可以获取消息并正确发送消息。
90%的时间里,一切正常,但是看起来Twilsock(我认为这是基础连接管理库)有时似乎断开了我的连接,此后客户端无法正确调用this.channel.sendMessage()。 sendMessage()调用超时,并且没有Promise拒绝来捕获客户端(因此我无法重新连接并重试)。
启用调试模式后,我在客户端上看到的错误似乎是:
2018-08-23T22:02:21.425Z Twilsock T: closing socket
然后客户端无法正常工作。如果我切换到另一个应用程序或放下wifi,然后返回浏览器和聊天页面,则可以在手机上重现这种情况(但不总是如此)。
这是关闭套接字后失败的消息尝试的样子:
2018-08-23T22:02:28.214Z Sync D: POST https://cds.us1.twilio.com/v3/Services/some_id/Lists/some_id/Items ID: RQb01f6b1df35f4f7ead730d990fcc0ef8
2018-08-23T22:02:45.209Z Chat Messages D: Sending text message One more after another app {}
2018-08-23T22:02:45.209Z Chat Session I: Adding command: sendMessage 11707143-0933-429d-bce0-ac2d37b5f699
2018-08-23T22:02:45.210Z Chat Session D: command arguments: {"channelSid":"something","text":"One more after another app","attributes":"{}","action":"sendMessage"} true
2018-08-23T22:02:45.223Z Sync D: POST https://cds.us1.twilio.com/v3/Services/some_id/Lists/some_id/Items ID: RQd8cdea2425724ba8b1c70970c4d890ea
2018-08-23T22:02:48.234Z Twilsock D: request is timed out
此之后:
2018-08-23T22:04:04.480Z Chat Session E: Failed to add a command to the session r@https:[some stuff] promiseReactionJob@[native code]
和
Uncaught (in promise) scheduleAttempt@https://[some stuff] promiseReactionJob@[native code]
刷新页面(并重新初始化客户端)可以解决此问题。
问题:
1)由于sendMessage()承诺没有被拒绝,我有什么办法可以捕捉到它并重试或重新初始化连接?
2)或者,是否存在可以在Twilsock关闭套接字时重新连接的回调函数?
3)是否需要添加其他任何连接管理最佳实践,以使我的应用程序尽可能健壮?
任何帮助表示赞赏。谢谢,谢谢,谢谢!
答案 0 :(得分:1)
Twilio刚刚发布了其聊天SDK的3.1.0版本,并修复了此连接问题。升级到此版本应该可以解决您的问题。