vue1.x + 网易云信开发过程中遇到的问题

736 阅读2分钟

vue1.x + 网易云信开发过程中遇到的问题

vue单页面应用中,切换路由时,因为没有收到服务器的回包,所以登录成功的回调就不执行了,登录没成功,后面的同步信息也就同步不到了,因为网易云信的SDK是单实例

解决方法如下:
  • 主要是在刚进入这个页面的时候检测需不需要reload此页面,用session来存一个标识,再在切换路由时销毁此标识
  • 主要就是需要重新加载一次页面,因为不手动刷新就没有相应的回调
methods: {
    validate() { // 登录验证
                setCookie('uid', this.loginMsg.account.toLocaleLowerCase())
                setCookie('sdktoken', this.loginMsg.token)
                this.sdk()
            },
            unvalidate() {
                // 断开 IM
                nim.disconnect();

                delCookie('uid');
                delCookie('sdktoken');

                this.$route.router.go("/welcome")
                window.location.reload()

            },
            
            sdk() {
                let _this = this
  
                var data = {}
                // 注意这里, 引入的 SDK 文件不一样的话, 你可能需要使用 SDK.NIM.getInstance 来调用接口
                nim = NIM.getInstance({
                    // debug: true,
                    db: true,
   
                    appKey: _this.loginMsg.appKey,  // 心猫
                    account: readCookie('uid'), //
                    token: readCookie('sdktoken'), //
                    onconnect: onConnect,
                    onwillreconnect: onWillReconnect,
                    ondisconnect: onDisconnect,
                    onerror: onError,
                    onmyinfo: onMyInfo,
                    onroamingmsgs: onRoamingMsgs,
                    onofflinemsgs: onOfflineMsgs,
                    onsessions: onSessions,
                    onupdatesession: onUpdateSession,
                    onusers: onUsers,
                    onfriends: onFriends,
                    onsyncfriendaction: onSyncFriendAction

                })

                console.log(nim)

                console.log('db:' + NIM.support.db) // 支持数据库



  


                function getUsersDone(error, users) {
                    console.log(error);
                    console.log(users);



                    // console.log('获取用户资料数组' + (!error?'成功':'失败'));
                    if (!error) {
                        onUsersFriends(users);
                    }
                }

                function onUsersFriends(users) {
                    data.users = nim.mergeUsers(data.users, users);
                    _this.friendsInfoList = data.users
                    // console.log('收到haoyou用户名片列表', JSON.stringify(users));



                }

    

                function onUsers(users) {
                    data.users = nim.mergeUsers(data.users, users);
                    _this.sdkData.users = data.users
                    console.log('收到用户名片列表', JSON.stringify(users));
                }



                function onDisconnect(error) {
                    // 此时说明 `SDK` 处于断开状态,开发者此时应该根据错误码提示相应的错误信息,并且跳转到登录页面
                    var that = this;
                    console.log('连接断开');
                    alert('连接断开')
                    if (error) {
                        switch (error.code) {
                            // 账号或者密码错误, 请跳转到登录页面并提示错误
                            case 302:
                                alert(error.message);
                                delCookie('uid');
                                delCookie('sdktoken');
                                window.location.href = './welcome';
                                break;
                            // 被踢, 请提示错误后跳转到登录页面
                            case 'kicked':
                                var map = {
                                    PC: "电脑版",
                                    Web: "网页版",
                                    Android: "手机版",
                                    iOS: "手机版",
                                    WindowsPhone: "手机版"
                                };
                                var str = error.from;
                                alert("你的帐号于" + dateFormat(+new Date(), "HH:mm") + "被" + (map[str] || "其他端") + "踢出下线,请确定帐号信息安全!");
                                delCookie('uid');
                                delCookie('sdktoken');
                                window.location.href = './welcome';
                                break;
                            default:
                                break;
                        }
                    }
                }

                function onRoamingMsgs(obj) {
                    console.log('漫游消息', obj);

                }

                function onOfflineMsgs(obj) {
                    console.log('收到离线消息', obj);

                }

                function onMyInfo(data) {
                    console.log('onMyInfo');
                    console.log(data.account)

                    _this.Object.account = data.account
                    _this.Object.avatar = data.avatar
                    _this.Object.createTime = data.createTime
                    _this.Object.gender = data.gender
                    _this.Object.nick = data.nick
                    _this.Object.updateTime = data.updateTime
                    console.log(_this.Object.updateTime)
                }

                function onConnect(data) {
                    console.log(data)
                    _this.loginMsg = '连接成功'
                    console.log("连接成功----------------", _this.loginMsg)
                }

                function onWillReconnect(obj) {
                    // 此时说明 SDK 已经断开连接 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
                    console.log('即将重连');
                    console.log(obj.retryCount);
                    console.log(obj.duration);
                }

                function onDisconnect(error) {
                    // 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
                    alert(`丢失连接:${error.message}`)
                    if (error) {
                        switch (error.code) {
                            // 账号或者密码错误, 请跳转到登录页面并提示错误
                            case 302:
                                break;
                            // 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误

                            case 417:
                                break;
                            // 被踢, 请提示错误后跳转到登录页面
                            case 'kicked':
                                break;
                            default:
                                break;
                        }
                    }
                }

                function onError(error) {
                    console.log(error);
                }

                function onSessions(sessions) {
                    console.log("收到会话哈哈哈------------------------", sessions)



                    data.sessions = nim.mergeSessions(data.sessions, sessions)
                    console.log(data.sessions)
                    _this.sdkData.sessions = data.sessions
                    // getAvatar(data.sessions)
                    getAvatarFilter(data.sessions)
                    _this.getLocalHistory() // 刷新界面

                }

                function onUpdateSession(session) {
                    console.log('会话更新了', session)
                    console.log(window._chatImThis, _this)


                    // 向上层发送消息
                    if (window.location.pathname.split("?")[0].split("/")[1] !== "imChat"  && session.unread > 0) {
                        document.querySelector('#im-unread-number-id-wrap').style.display = "list-item"
                        document.querySelector("#im-unread-number-id").innerHTML = session.unread

                    } else {
                        document.querySelector('#im-unread-number-id-wrap').style.display = "none"
                    }




                    data.sessions = nim.mergeSessions(data.sessions, session)
                    _this.sdkData.sessions = data.sessions
                     // getAvatar(data.sessions)
                    getAvatarFilter(data.sessions)
                    _this.getLocalHistory(); // 刷新界面

                    nim.getFriends({
                        done: getFriendsDone
                    });

                    function getFriendsDone(error, friends) {
                        console.log('获取好友列表' + (!error?'成功':'失败'), error, friends);
                        if (!error) {
                            onFriends(friends);
                        }
                    }

                }


                function getAvatar(sessions) {   // 头像列表
                    let arr = [], avatarArr = []
                    sessions.forEach((item) => {
                        let account = item.id.split('-')[1]  //// 111111111111111111111
                        arr.push(account)
                    })
                    nim.getUsers({
                        accounts: arr,
                        done: setChatList
                    })
                }


                function getAvatarFilter(sessions) {   //   对话不过滤 只过滤需要显示头像的账号
                    let arr = [], avatarArr = []
                    sessions.forEach((item) => {
                        if (accountFliter(item.lastMsg)) {
                            let account = item.id.split('-')[1]  //// 111111111111111111111
                            arr.push(account)
                        }
                    })
                    nim.getUsers({
                        accounts: arr,
                        done: setChatList
                    })
                }

                function accountFliter(lastMsg) {
                    let bool = true
                    let type = lastMsg.type
                    if (type == 'custom') {
                        try {
                            let xmType = JSON.parse(lastMsg.content).xmMessageType
                            if (xmType != 3 && xmType != 102 && xmType != 103 && xmType != 104 && xmType != 105) {
                                bool = false
                            }
                        } catch(e) {
                            console.log(e)
                        }


                    }
                    return bool
                }


                function setChatList(error, users) {
                    if (!error) {
                        users.forEach((item, index) => {
                            _this.sdkData.sessions.forEach((chat) => {
                                if (chat.id.split('-')[1] == item.account) {
                                    chat.path = item.avatar
                                    chat.nick = item.nick
                                }
                            })
                        })
                    }
                    _this.sessions = _this.sdkData.sessions

   

  



                }


 

            },
  
},

route: {

            deactivate(transition) {
                window.sessionStorage.removeItem("imChatIsNeedReload")
                transition.next()
            }
        },

        ready() {

            if (!sessionStorage.getItem('imChatIsNeedReload')) {
                window.sessionStorage.imChatIsNeedReload = '11111111111'
                window.location.reload()
            }


            this.validate();

        }